RDG Defense Guide

水一篇,文章拷来拷去

一些小操作

一些常见的站点目录,有时候能大派用场

  • Nginx目录:/usr/local/nginx
  • MySQL目录:/usr/local/mysql
  • MySQL数据库所在目录:/usr/local/mysql/var 或者 /var/lib/mysql
  • PHP配置文件目录:/usr/local/php 或者 /etc/php/x.x/
  • Nginx 站点默认目录:/var/www/html/usr/local/nginx/html
  • Apache 站点默认目录:/var/www/html/usr/local/apache/
  • Java 目录:
    • 找之前先运行下 ps -aux
    • 一般 /usr/webapp/xxx 或者 /app/xxx
  • 其他语言
    • ps -aux

如果实在不知道建议请教裁判

例题1 (web)

题目描述:flag在/secret,admin可以看,但是别人不行;修补白名单命令:[‘mv’, ‘cp’, ‘chmod’];防御环境会在文件替换后重启服务

具体防御方法如下

  1. 了解flask_login模块鉴权过程

给大家推荐一份文档,Flask-Login — Flask-Login 中文 0.4.1 文档 (flask-login-cn.readthedocs.io),可以简单过一遍,我们待会用到的就是文档里边的 autherization

先导入一个current_user(作用:当前用户的代理对象。)它的值为 models/user.py 里的字段,如 current_user.username == self.username = username

  1. 设置权限

仔细审题,flag在/secret,只有admin可以看,题目的意思是我们只需要能让admin看到flag就行了,别的用户不行,所以在 /admin/console 这个路由加个条件判断,修补方法查看注释即可

  1. 对别的路由进行过滤

由于题目已经事先给我们准备好了waf,我们看看还有没有别的地方需要过滤(如果不是admin用户)

会发现/process_file这个路由也可以直接读/secret文件,将上面的WAF稍作修改替换下即可

  1. 打包
1
2
3
#!/bin/bash
mv main.py /app/main.py
chmod 755 /app/main.py

结构如下

例题2 (web)

题目描述:该金融系统开发时引入了不安全的组件,你能找到里面的后门修复漏洞吗?修补的白名单命令[‘mv’, ‘cp’, ‘chmod’,’rm’]

这里需要找到web运行的目录在哪,一般直接 ps -aux 查看当前有哪些进程正在运行

如下图,可以很容易看出来是tomcat正在运行

由此可以找到对应的web目录为 /tomcat/webapps/ROOT,同样先对其打包操作,然后看看哪里存在漏洞

比如这题,是存在一个 .shell.jsp 木马文件

直接查看该文件得到下图,很明显的木马文件

可以直接用D盾扫,或者用河马查杀工具(如果是线上的话),这题考查的是开发时引入了不安全的组件,所以我们查看tomcat的lib文件,看看最近一次做修改的是哪个文件

最后发现有个依赖是5月份修改的

下载下来拖到jadx反编译看看是不是马

Filter内存马,证据确凿了,利用姿势

修补方法

1
2
3
4
5
6
#!/bin/bash
rm -fr /tomcat/webapps/ROOT/.*.jsp
cp -pa shell.jsp /tomcat/webapps/ROOT/.shell.jsp
cp -pa index.jsp /tomcat/webapps/ROOT/index.jsp
rm -fr /tomcat/webapps/ROOT/*.html
rm -fr /tomcat/lib/tomcat-i18n-bk.jar

结构

例题3 (web)

题目描述:你能找到文件读取漏洞吗?

老样子,先看一下用啥跑的

发现使用 java -jar 直接跑jar包,然后搜一下文件在哪,这里搜出来路径为 /meeadmin/mee-admin.jar

查看目录会发现有files和logs,我们以files为入口点,猜测文件写入最终是写到这个目录里的

题目给了源代码,直接用idea打开源代码加载工程,记得重载maven

双击shift搜file,同时可以搜一下sql表在哪,本地起一个数据库,方便调试(可选)

搜到一个FileUploadController类

alt+7看看文件结构,有上传就会有下载

定位到当前类的包里,会发现还有一个CommonFileController类

类里边存在一个fileName和filePath

为了测试是否存在任意文件下载漏洞,可以构造一个payload,http://xxx.xxx.xxx.xxx:32201/mee/common/file?fileName=1.txt&filePath=../../../flag 如图,发现下载成功

知道了漏洞点,那防御方式就非常简单了,filePath过滤掉 ../ 就行

然后重新打包一下

修补包

1
2
#!/bin/bash
mv mee-admin.jar /meeadmin/mee-admin.jar

结构

例题4 (pwn)

题目描述:Write memos and memo will help you remember things.

IDA打开反编译一下

一个很明显的格式化字符串漏洞,printf少了格式化字符串

所以修补办法很简单,第一种方法考虑把格式化字符串写入rdi中,在eh_frame段中加入一个%s的格式化字符串,然后在eh_frame上面写一段

1
lea rdi addr

然后在调用printf函数的时候跳转过来,需要给eh_frame段附上可执行权限 总体来说比较麻烦

第二种方法考虑把格式化字符串换成puts函数

由于这题用的是偏移计算plt函数的方式

首先注意到plt函数距离printf函数0x20的距离

这边的E8的x86汇编表示的是call 79 FC FF FF 表示的偏移的补码形式

我们只需要把0x79-0x20就可以把它变成puts了

但是如果遇到的不是偏移形式的,也就是没开plt.sec保护的情况下 可以直接修改printf为puts

接下来会遇到一个问题 就是puts函数比起printf函数会多打印一个回车也就是/n,但是我们可以看到程序在printf之后又加上了一个 puts。我们可以把上面的printf改成puts,然后再把下面的那个puts给nop掉这样就可以完成修改了

Java防御

使用软件:

  • IDEA Ultimate Edition,社区版的IDEA功能会不全,打起包来会很麻烦(用途:开发,代码审计,打包用)

  • Jadx(用途:反编译工具)

定位漏洞点

一些需要注意的函数

方便代码定位,定位代码快捷键IDEA双击Shift,然后直接搜即可

  • InputStream(文件写入/读取)
  • OutputStream(文件写入/读取)
  • FileInputStream(文件写入/读取)
  • readObject/writeObject(反序列化漏洞)
  • Execute/URLConnection/executeMethod(请求伪造)

打包姿势

如果有源代码

IDEA打开直接加载,重载下Maven,然后数据库该配的配一下,如果懒得配(不调试)直接定位到漏洞点修改文件就行,参考上面的 meeadmin 这题

修改完文件后右边Maven图标点开package按一下就行,然后会在target/*里生成一个jar包或者war包

如果没有源代码

Jadx打开jar或者war包,找到存在漏洞的类,如下图

然后根据Jadx的项目结构新建一个IDEA项目

将反编译后需要修改的代码复制过去(如果有文件依赖也要一起复制)

然后看看有没有lib包,如果有的话在 webapp\WEB-INF\ 下新建一个 lib 文件夹,如下图

然后把反编译后的lib里的jar包放进去接着右键IDEA里的lib文件夹创建库即可,打包方式和上面的一样

Java防御

数组循环过滤

1
2
3
4
5
6
7
8
9
10
String[] filterList = {"apple", "banana", "cherry"};
String str = "ana"; // 匹配包含"ana"的字符串
for (String s : filterList) {
if (s.contains(str)) {
System.out.println("Hacker!");
// 返回空值
return;
}
}

或者一些字符串常用函数

1
s.contains("xxx") || s.contains("xxx") || s.contains("xxx") || s.contains("xxx")

关于过滤这块建议下个 https://github.com/Drun1baby/JavaSecFilters

不建议直接用replace替换

PHP防御

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function wafrce($str){
return !preg_match("/openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|scandir|assert|pcntl_exec|fwrite|curl|system|eval|assert|flag|passthru|exec|chroot|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore/i", $str);
}
function wafsqli($str){
return !preg_match("/select|and|\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleexml|extractvalue|+|regex|copy|read|file|create|grand|dir|insert|link|server|drop|=|>|<|;|\"|\'|\^|\|/i", $str);
}
function wafxss($str){
return !preg_match("/\'|http|\"|\`|cookie|<|>|script/i", $str);
}
if (preg_match('/system|tail|flag|exec|base64/i', $_SERVER['REQUEST_URI'])) {
die('no!');
}

# SQL注入
$pattern = "select|values|tables|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";
# 命令执行和文件读取
$pattern.= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern.= "|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern.= "|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";

Python防御

数组过滤法

1
2
3
4
5
filter_list = ["apple", "banana", "cherry"]
strings = "ana" # 匹配包含"ana"的字符串
for i in filter_list:
if i in strings:
print("Hacker!" )

字符串匹配法

1
2
if 'xxx' in arr:
return ''

针对SSTI进行过滤

1
2
3
4
5
6
7
8
9
10
11
过滤
{{
}}
{
}
{%
class
'
"
.
_

一些常用的Web框架文档

Node防御

过滤关键词

1
2
3
4
5
6
const keywords = ["apple", "banana", "cherry"];
for (const i of keywords) {
if (code.includes(i)) {
console.log("Hacker!")
}
}

针对命令执行

  • child_process
  • exec
  • execFile
  • spawn
  • openSync
  • [
  • ]
  • `
  • +
  • Reflect

update.sh命令速查

仅针对update.tar.gz修补包传上去后会异常的情况,如果有些题目原文件(没有做修补的)传上去后显示check检测失败,那么有可能需要我们自己重启服务端

Go语言

1
2
3
4
5
#!/bin/bash
kill -9 $(pidof app)
cp 修改后的附件 /app
chmod +x /app
/app 2>&1 >/dev/null &

Python语言

1
2
3
cp /app.py /app/app.py
ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup python app.py >> /opt/app.log 2>&1 &

PHP语言

1
2
#!/bin/bash
cp /index.php /var/www/html/index.php

Nodejs语言

1
2
3
4
5
Nodejs语言
#!/bin/sh
cp server.js /app/server.js
ps -ef | grep node | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup node server.js >> /opt/aa.log 2>&1 &

Java语言

1
2
3
4
#!/bin/sh
mv -f ROOT.war /opt/tomcat/webapps/ROOT.war
sh /opt/tomcat/bin/shutdown.sh
nohup sh /opt/tomcat/bin/catalina.sh run > myout.txt 2>&1 &

一些文档(只看防御)

Author

IceCliffs

Posted on

2024-10-13

Updated on

2024-10-18

Licensed under

Kommentare