当前位置: 首页 > 科技观察

Linux服务器安全事件应急的一些随笔-备份文章

时间:2023-03-12 22:11:39 科技观察

前言最近遇到了好几起Linux服务器的安全应急响应。以前这方面的经验不是很足,一般都是靠大家写的文章Linux下的一些基础知识来分析这几次遇到的事件,事后想想,面对这些紧急事件,有很多地方考虑的不是很全面,所以写这篇文章来记录一下自己的想法。尽量利用系统自身最基本的功能,完成应急取证前期的备份工作。突出重要的事情并说四次备份!备份!备份!备份!原始数据备份在应急分析过程中的重要性不言而喻,但甲方父亲在这些突发事件中似乎忽略了这个问题。当我们到达现场时,甲方父亲要么已经被入侵的一波服务器毁了,要么备份了,只备份了一波日志。系统镜像备份备份#ddif=/dev/sdaof=bak.imgrecovery#ddif=bak.imgof=/dev/sdbfdisk-l查看磁盘分区#fdisk-lDisk/dev/sda:8589MB,8589934592bytes255heads,63sectors/track,1044cylindersUnits=cylindersof16065*512=8225280bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDiskidentifier:0x000a7707DeviceBootStartEndBlocksIdSystem/dev/sda1*1101381368918eLinuxLVM/dev/sda210141044249007+5Extended/dev/sda51014104424897683Linuxdf-h查看磁盘占用情况#df-hFilesystemSizeUsedAvailUse%Mountedon/dev/mapper/brokenwebapps-root7.3G5.8G1.2G84%/none497M176K497M1%/devnone502M12K502M1%/dev/shmnone502M300K501M1%/var/runnone502M0502M0%/var/locknone502M0502M0%/lib/init/rwnone7.3G5.8G1.2G84%/var/lib/ureadahead/debugfs/dev/sda5228M44M173M21%/boot/dev/sdb112G159M12G2%/test#ddif=/dev/sdaof=bak.img进行备份,等几分钟,备份备份完成后发送到我们的分析系统#scpbak.imgroot@192.168.232.132:/root/挂载分析系统环境-kali使用losetup命令虚拟出一个loop设备挂载镜像查看第一个idleloopdevice#losetup-f/dev/loop0创建循环设备#losetup/dev/loop0bak.img#fdisk-lDisk/dev/loop0:8GiB,8589934592bytes,16777216sectorsUnits:sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDisklabeltype:dosDiskidentifier:0x000a7707DeviceBootStartEndSectorsSizeIdType/dev/loop0p1*6316273844162737827.8G8eLinuxLVM/dev/loop0p21627384516771859498015243.2M5Extended/dev/loop0p51627390816771859497952243.1M83Linux是单独挂载的。通过x我们需要通过x映射每个分区,所以我们需要映射每个分区读取并映射分区表#kpartx-av/dev/loop0addmaploop0p1(254:0):016273782linear7:063addmaploop0p2(254:1):02linear7:016273845addmaploop0p5(254:2):0497952linear7:016273908映射后,我们通过ls-l/dev/mapper/lrwxrwxrwx1rootroot7Nov607:46brokenwebapps-root->../dm-3lrwxrwxrwx1rootroot7Nov607:46brokenwebapps-swap_1->../dm-4crw-------1rootroot10,236Nov607:46controllrwxrwxrwx60root7root/4:dm-0lrwxrwxrwx1rotoviewthe映射关系。Linux下的映射器设备是内核中提供的一种逻辑设备到物理设备的映射机制。通过这个设备,我们可以清楚的看到根分区所在的位置。mountmount接下来我们将根分区挂载到我们的测试目录下#mount/dev/mapper/brokenwebapps-root/test/切换到测试目录下查看,整个文件系统已经恢复到我们的分析系统下了,我们可以在我们的分析系统上对被攻陷主机进行更深入的分析分析卸载#umount/dev/mapper/brokenwebapps-root卸载kpartx映射#kpartx-dv/dev/loop0如果无法卸载,可以先卸载映射逻辑device通过lvremove命令然后通过kpartx卸载映射卸载loop设备#losetup-a查看当前创建的loop设备/dev/loop0:[2049]:2107674(/root/bak.img)#losetup-d/dev/loop0卸载内存镜像备份测试环境:Linuxkali4.9.0-kali4-amd64#1SMPDebian4.9.30-2kali1(2017-06-22)x86_64GNU/Linux在比较老的Linux上,一般内核版本在2.6以下,应该可以通过dd命令进行内存映像备份。命令如下:ddif=/dev/memof=dumpmem.ddbs=1024使用dd命令dump/dev/mem设备的内容完成内存备份,但是2.6以下的内核版本可能看不到太多经常,所以我没有具体测试这个命令导出的具体效果。由于Linux安全要求,2.6及以上版本开始限制我们直接访问系统内存。因此,我们可能不得不违背我们做内存备份的初衷,需要参考第三方模块来完成我们的工作。一开始,我尝试使用的工具是fmem,它通过将自身加载到Linux内核并创建/dev/fmem设备来运行,让我们可以继续使用dd命令来备份我们的内存。但是我并没有编译成功,因为我找的模拟环境是owasp的一个漏洞环境,但是它的源已经连接不上了,无法更新内核开发包,所以无法编译成功.我搬到了卡利,编译也失败了。问题很可能是内核版本不匹配。如果有机会,我们可以在研究中解决它。上面说了,由于一开始使用的环境,导致内核开发包无法更新,所以注意以下操作都是在Kali下完成的。具体的Kali内核版本在继续讲内存镜像备份之前在内核开头已经说明了。无论如何,模块的加载不是一个严肃的讨论。先参考度娘百科吧。可以大致理解为Linux内核是一块支持热插拔的板卡。在其运行过程中,我们可以随时插入功能板来扩展其功能。我们可以在不使用时拔掉这个功能板。这样,我们就可以在不修改内核的情况下扩展它的功能。上面提到的fmem也应用了Linux内核的这个特性,下面要用到的工具也是运行在这个特性上的。在linux中,我们可以使用lsmod查看板子中插入了哪些功能版本,insmod插入一个新的功能版本rmmod,拉出一个功能版本内存备份工具LiME如果遇到编译问题,比如出现类似的错误make-C/lib/modules/2.6.32-25-generic-pae/buildM="/test/LiME/src"modulesmake[1]:Enteringdirectory`/lib/modules/2.6.32-25-generic-pae/build'make[1]:***Noruletomaketarget`modules'.Stop.make[1]:Leavingdirectory`/lib/modules/2.6.32-25-generic-pae/build'make:***[default]Erro你可能需要这个命令apt-getinstalllinux-headers-$(uname-r)安装当前内核开发包编译LiME记得安装内核开发包到/lib/modules/xxxx-amd64目录下查看是否有软构建和源链接。如果没有,通过以下命令创建ln-s/usr/src/linux-headers-x.xx.x-x-amd64buildln-s/usr/src/linux-headers-x.xx.x-x-commonsource如果没有其他错误,我们可以加载这个模块进行内存备份,进入其src目录编译#makemake-C/lib/modules/4.9.0-kali4-amd64/buildM="/root/Github/LiME/src"modulesmake[1]:Enteringdirectory'/usr/src/linux-headers-4.9.0-kali4-amd64'Buildingmodules,stage2.MODPOST1modulesLD[M]/root/Github/LiME/src/lime.komake[1]:Leavingdirectory'/用户名/src/linux-headers-4.9.0-kali4-amd64'strip--strip-unneededlime.komvlime.kolime-4.9.0-kali4-amd64.ko成功后会在当前目录生成lime-4.9.0-kali4-编译amd64.ko文件执行命令#insmod./lime-4.9.0-kali4-amd64.ko"path=/test/testmem.limeformat=lime"稍等片刻即可完成内存备份,其中path参数为备份内存中保存的路径,format为存储格式,推荐使用lime格式,方便我们后面通过volatility分析。简单测试下刚刚备份的内存能否被volatility识别#pythonvol.py-f/test/testmem.lime--profile=Linuxkalix64limeinfoVolatilityFoundationVolatilityFramework2。6MemoryStartMemoryEndSize-----------------------------------------------------0x00000000000010000x000000000009f3ff0x000000000009e4000x00000000001000000x00000000546dffff0x00000000545e00000x00000000547000000x00000000547fffff0x0000000000100000内存备份完后卸载lime模块很无奈的备份安全应急实施过程中有时候甲方爸爸也不一定让你搞这搞那,一句话,你要啥日志~我~甲方爸爸~给个日志~这时候难免被霸道的嚣张给震撼了,记录下哪些日志和文件需要备份,以免遗漏。我们需要过滤打包#tar-czvfxx_var_log_time.tar.gz/var/log万一web入侵,我们需要备份web应用,nginx日志等经常遗漏的内容。备份passwd和shadow文件,分析是否有可疑账号比如一些本应是系统用户的账号有密码字段#cat/etc/passwd>etc_passwd.txt#cat/etc/shadow>etc_shadow.txt备份当前网络连接#netstat-anp>netstat_anp.txt备份历史命令#cp~/.bash_historybash_history.txt备份历史与时间和执行者格式#??exportHISTTIMEFORMAT="%Y-%m-%d:%H-%M-%S:`whoami`:"#history>history.txt备份用户登录信息#w>col_users.txt#lastlog>lastlog.txt搜索文件修改最近5天#find/-typef-mtime+5备份进程信息#ps-ef>ps_ef.txt#psaux>ps_aux.txt备份重要文件或命令的md5值懒人方法:设置为备份目录#TESTDIR='/bin/'#find$TESTDIR-typef-print0|xargs-0md5sum>dir_bin_cmd.md5备份bin目录下所有命令的md5值,生成完整或自定义的目录文件系统树形结构图#tree>tree.txt或定义生成目录的深度#树-L2