关于移动端压测工具

一、APP 自动化测试工具

Appium

官网:http://appium.io/
Github 地址:https://github.com/appium/appium
介绍:
Appium 是一个开源的、跨平台的自动化测试工具。支持自动化 iOS,Android 和 Windows 桌面平台上的原生、移动 Web 和混合应用。 开发者可以使用 WebDriver 兼容的任何语言编写测试脚本,如 Java,OC,JS,PHP,Python,Ruby,C#,Clojure 和 Perl 语言。是做 UI 自动化测试必须要掌握的工具之一。

Airtest

官网:http://airtest.netease.com/
介绍:
Airtest 是网易游戏推出的一个 UI 自动化测试工具,适用于游戏和应用,支持的平台为 Windows,Android 和 iOS。Airtest 提供了跨平台的 API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位 UI 元素,你无需嵌入任何代码即可进行自动化测试。 并且测试脚本运行后可以自动生成详细的 HTML 测试报告。

uiautomator2 (python)

Github 地址:https://github.com/openatx/uiautomator2
介绍:
uiautomator2 是一个可以使用 Python 对 Android 设备进行 UI 自动化的库。其底层基于 Google uiautomator,Google 提供的 uiautomator 库可以获取屏幕上任意一个 APP 的任意一个控件属性,并对其进行任意操作。

二、APP 稳定性测试工具

Monkey

地址:https://developer.android.google.cn/studio/test/monkey
介绍:
Monkey 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。使用 Monkey 以随机且可重复的方式对正在开发的应用进行压力测试。

MonkeyRunner

地址:https://developer.android.google.cn/studio/test/monkeyrunner
介绍:
monkeyrunner 工具提供了一个 API,用于编写可从 Android 代码外部控制 Android 设备或模拟器的程序。使用 monkeyrunner,可以编写一个 Python 程序去安装 Android 应用或测试软件包,运行它,向其发送按键,截取其界面的屏幕截图,并将屏幕截图存储到工作站中。monkeyrunner 工具主要用于在功能/框架级测试应用和设备以及运行单元测试套件,但也可以自由地将其用于其他目的。

Maxim

Github 地址:https://github.com/zhangzhao4444/Maxim
介绍:
Maxim 是基于 monkey 做的二次开发,相较原生 monkey,相对智能。除了保留原生 monkey 已有的功能外,可深度遍历控件,可自定义黑白名单,可设定执行时长,增加防睡眠/防假死机制、防跳出/防误点状态栏及下拉状态栏等。

UICrawler

Github 地址:https://github.com/lgxqf/UICrawler
介绍:
基于 Appium 的 App UI 遍历 & Monkey 工具,支持 Android 和 Ios 移动 App,或 H5 或微信等应用。v2.3 版已支持 Appium 1.16.0, Java-client 7.3.0。

三、APP 性能测试工具

GT

官网:https://gt.qq.com/
介绍:
腾讯开源的 APP 的随身调测平台,支持 ios 和 android。直接运行在手机上,可对 APP 进行快速的性能测试(CPU、内存、流量、电量、帧率/流畅度等等)、开发日志的查看、Crash 日志查看、网络数据包的抓取、APP 内部参数的调试、真机代码耗时统计等。

Perfdog

官网:https://perfdog.qq.com/
介绍:
腾讯游戏部门开发的移动全平台 iOS/Android 性能测试、分析工具平台。手机无需 ROOT/越狱,手机硬件、游戏及应用 APP 也无需做任何修改,极简化即插即用。
PerfDog 支持 iOS 和 Android,支持移动平台所有应用程序(游戏、APP 应用、浏览器、小程序、小游戏、H5、后台系统进程等)、Android 模拟器、云真机等性能测试。PC 上 PerfDog 可多开,单 PC 可同时测试多台手机。目前免费体验,谁用谁香。

SoloPi

Github 地址:https://github.com/alipay/SoloPi
介绍:
SoloPi 是一个无线化、非侵入式的 Android 自动化工具。除了公测版的录制回放、性能测试、一机多控三项主要功能之外,SoloPi 还提供了数据 Mock,性能加压、网络模拟、智能 Monkey 等功能,能为测试开发人员节省宝贵时间。

四、APP 弱网测试&抓包工具

QNET

官网:https://wetest.qq.com/product/qnet
介绍:
QNET 是腾讯 wetest 服务平台推出了一款 App 弱网测试工具,该工具无需 ROOT 手机,无需连接数据线,以独立 app 的方式,为用户提供给快捷、可靠、功能完善的弱网络模拟服务(2G 网络、极差网络、连续丢包、正常网络、4G 网络、100%丢包等)。另外 QNET 还支持 TCP/UDP 网络协议抓包。

Fiddler

官网:https://www.telerik.com/fiddler
介绍:
Fiddler 是一款大家熟知且功能强大的抓包工具。通过设置代理,能够记录客户端与服务器端所有 http(s)通讯。可以针对捕获到的请求进行分析、设置断点、篡改请求及返回数据,还可以设置网络丢包和延时进行弱网络模拟等等。

Charles

官网https://www.charlesproxy.com/
介绍:
Charles 是 HTTP 代理/ HTTP 监视器/反向代理,可以查看其计算机与 Internet 之间的所有 HTTP 和 SSL / HTTPS 通信。可对截取的请求及响应进行分析、支持修改请求参数、支持弱网络模拟。

五、APP 兼容性测试工具

TestIn

官网https://www.testin.cn/
介绍
Testin 是国内较早涉足云测试领域的平台之一。终端种类及数量都比较全面。提供远程真机测试、标准/深度/遍历兼容测试、自动化测试、测试专家驻场等。支持 Android 与 iOS 系统。但目前仅少部分服务为免费,绝大多数服务为收费项目。

腾讯优测

官网:https://utest.21kunpeng.com/home
介绍:
腾讯旗下的云测试服务平台,拥有超过 3000 台真机实验室,覆盖市面 99%主流机型。拥有十年终端测试服务经验,提供兼容性测试、自动化测试、云真机、设备分享等多种服务方式。

百度 MTC

官网:http://mtc.baidu.com/
介绍:
百度 MTC 是百度开放平台旗下的移动云测试中心。提供超过 1500 款热门机型。提供的测试服务种类有兼容性测试、性能测试、功能测试。并且提供了脚本录制工具,类似 Testin。
百度 MTC 的服务目前主要为收费服务。

阿里 MQC

官网:https://www.aliyun.com/product/mqc
介绍:
阿里 MQC 是阿里巴巴旗下的移动测试平台。提供大量热门机型,支持 Android 及 iOS 系统。提供兼容性测试、功能测试、性能测试以及稳定性测试。

六、APP 安全测试工具

OWASP ZAP

官网:https://owasp.org/www-project-zap/
介绍:
OWASP ZAP 是目前最流行的免费 APP 移动安全测试工具,由全球数百个志愿者管理维护。该工具支持多种脚本语言类型,易安装,可以在 APP 的开发和测试阶段自动查找安全漏洞。

Drozer

Github 地址:https://github.com/FSecureLABS/drozer
介绍:
Drozer 是一个由 MWR 安全团队维护开源的软件,该软件是针对 Android 平台的安全审计和攻击框架。安全人员可通过 drozer 自身提供的一些 module 完成一些基础的安全测试功能,同时也可以根据需求实现自己的 module,甚至可以在利用 drozer 提供的框架实现一些自动化审计功能。

MobSF

Github 地址:https://github.com/MobSF/Mobile-Security-Framework-MobSF
介绍:
MobSF 是一款自动化移动 App 安全测试工具,适用于 iOS 和 Android,可熟练执行动态、静态分析和 Web API 测试。可用于对 Android 和 iOS 应用进行快速安全分析。

QARK

Github 地址:https://github.com/linkedin/qark
介绍:
QARK 是一个静态代码分析工具,旨在识别基于 Java 的 Android 应用程序的潜在安全漏洞和关注点。QARK 还试图提供动态生成的 ADB(Android 调试桥)命令,以帮助验证其检测到的潜在漏洞。它甚至可以动态地创建一个定制的测试应用程序,以即用 APK 的形式,确定潜在问题。

WRK

Github 地址:https://github.com/wg/wrk/tree/master
介绍:
wrk 是一个测试并发的工具,类似 adb(ab -c 100 -n 100 http://192.168.2.56:19015/index.html)原理(wrk -t12 -c400 -d30s http://192.168.2.56:19015/index.html)

利用Socat实现单端口转发中继

前言:

oracle cloud 提供的云 mysql 通过外网链接是需要填写指定 CIDR 范围的白名单 IP,然而这个白名单 IP 不支持 0.0.0.0/24 全域,因此提供几个中继思路进行解决。

解决

Socat

假设需求是:PC1(192.168.1.215) 需要使用 PC1 3306 端口直接跳到 PC2 的 MySQL(192.168.1.91)
开始安装
Centos 系统:yum install -y socat
Debian/Ubuntu 系统:apt-get update apt-get install -y socat
成功后即可可以使用
socat -d -d -lh -v -lf /home/mysql.log tcp-l:3306,fork,reuseaddr tcp:192.168.1.91:3306
参数解析

-lh 将主机名添加到日志消息
-v 详细数据流量,文本
-x 详细数据流量,十六进制
-d 增加详细程度(最多使用 4 次;建议使用 2 次)
-lf 记录到文件

但是该命令键入后有个问题,那便是不能持久化运行,初步考虑在命令前添加 nohup 或注册 systemctl
以 debian11 为例,在目录/etc/systemd/system/下创建一个新的 service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=socat mysqli to tcp
Documentation=https://blog.catooilg.com
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=always

; User and group the process will run as.
User=root
Group=root

ExecStart=/usr/bin/socat -d -d -lh -v -lf /home/mysql.log tcp-l:3306,fork,reuseaddr tcp:192.168.1.91:3306

; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=512

[Install]
WantedBy=multi-user.

重载服务systemctl daemon-reload
启动服务 systemctl start nginx
即可完成注册

iptables

1
2
3
4
5
6
iptables -I INPUT -p tcp -m tcp --dport 转发机监听端口 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 转发机监听端口 -j DNAT --to-destination c2 ip:c2 port
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -I FORWARD -j ACCEPT
iptables -P FORWARD ACCEPT
sysctl net.ipv4.ip_forward=1

Apache

假设需求是:PC1(192.168.1.215) 需要使用 PC1 IP 直接跳到 mywbg.com

1
2
3
4
5
6
apt-get install apache2
a2enmod rewrite headers proxy proxy_http ssl cache
a2dismod -f deflate
a2ensite default-ssl
a2dissite 000-default
service apache2 reload

配置/etc/apache2/sites-enabled/default-ssl.conf 添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Directory "/var/www/html">
Options +Indexes +FollowSymLinks +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
LogLevel alert rewrite:trace5

# Enable SSL
SSLEngine On
# Enable SSL Proxy
SSLProxyEngine On
# Trust Self-Signed Certificates generated by CobaltStrike
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

修改/etc/apache2/ports.conf,注释 80 端口监听,然后执行以下命令

1
2
3
4
5
6
git clone https://github.com/threatexpress/cs2modrewrite
cd cs2modrewrite
python3 cs2modrewrite.py -i default.profile -c https://192.168.1.215:8080 -r https://www.baidu.com > /var/www/html/.htaccess
-i 表示所使用的c2配置文件
-c 根据监听器配置设置
-r 表示非法访问重定向url

同时在对机添加以下参数

1
2
3
http-config {
set trust_x_forwarded_for "true";
}

trust_x_forwarded_for 选项决定 Cobalt Strike 是否使用 X-Forwarded-For HTTP 头来确定外部 ip。使用 HTTP 重定向器开启此选项,可以让 CS 显示外部 ip 的时候不再显示为代理服务器的。
如果你需要自定义 apache ssl 证书则需要修改/etc/apache2/sites-enabled/default-ssl.conf

1
2
3
SSLCertificateFile	/etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
#请尽量使用真实的ssl证书

以上配置中如果你需要使用 http 服务来转发你可以不关闭 80 端口
如果需要修改相关规则可以自行修改/var/www/html/.htaccess

Nginx

假设需求是:PC1(192.168.1.215) 需要使用 PC1 IP 直接跳到 mywbg.com
安装
apt-get install nginx nginx-extras
添加新模块
git clone https://github.com/threatexpress/cs2modrewrite
编译
python3 ./cs2nginx.py -i default.profile -c https://192.168.1.215:8080 -r https://www.baidu.com -H mywbg.com >/etc/nginx/nginx.conf
参数解析

-i 表示所使用的 c2 配置文件
-c 根据监听器配置设置
-r 表示非法访问重定向 url
-H 指向代理主机的域名

修改/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
#将80端口注释关闭http
#listen 80;
#listen [::]:80;

#取消443端口注释开启https
listen 443 ssl;
listen [::]:443 ssl;

#取消ssl证书设置注释配置ssl证书
ssl_certificate /root/server.crt;
ssl_certificate_key /root/server.key;

配置完成后重启 nginx,开始配置 CS
CS 配置 C2 文件的时候在 C2 文件里加入如下选项

1
2
3
http-config {
set trust_x_forwarded_for "true";
}

trust_x_forwarded_for 选项决定 Cobalt Strike 是否使用 X-Forwarded-For HTTP 头来确定外部 ip。使用 HTTP 重定向器开启此选项,可以让 CS 显示外部 ip 的时候不再显示为代理服务器。

引用

利用 Socat 实现单端口 中继(中转/端口转发)加速
socat 链接持久的最佳方法是什么

CentOS7中升级Curl

先情提要

在部署 php7.4 的时候,发现 make 错误,翻看日志提示 curl 版本不支持几个函数,原来是机器部署的 curl 版本过低 curl 7.54.1_2017 (x86_64-pc-linux-gnu)
遂开始着手升级至最新 8.0.30

实施过程

先看看目前curl 版本,是否可以使用
yum update curl
因为部分第三方云已经把内核替换成自家(华为云与火山引擎)不行,则需要自己手工更新
1、首先安装 epel-release
yum -y install epel-release

2、下载并安装 curl 的 rpm 包
wget http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/city-fan.org-release-3-8.rhel7.noarch.rpm
rpm -ivh city-fan.org-release-2-2.rhel7.noarch.rpm

3、将[city-fan.org]的 enable 值修改为 1
vim /etc/yum.repos.d/city-fan.org.repo

1
2
3
4
5
6
7
[city-fan.org]
name=city-fan.org repository for Red Hat Enterprise Linux (and clones) $releasever ($basearch)
#baseurl=http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel$releasever/$basearch
mirrorlist=http://mirror.city-fan.org/ftp/contrib/yum-repo/mirrorlist-rhel$releasever
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-city-fan.org

4、更新 curl
yum update curl --enablerepo=city-fan.org -y

5、安装完成,检查版本,完成升级
curl -V

6、同时移除 city-fan.org.repo 并删除
cp /etc/yum.repos.d/city-fan.org.repo /etc/yum.repos.d/city-fan_bak.org.repo -a

如果此方法不能正常升级,请确认系统是否安装了多个 curl
which curl
whereis curl
如果无法确认,可以选择编译安装,然后重新系统指向

1
2
3
4
5
6
7
wget https://curl.haxx.se/download/curl-7.76.1.tar.gz
tar -xvf curl-7.76.1.tar.gz
cd ./curl-7.76.1
./buildconf
./configure --with-ssl=/opt/openssl --with-nghttp2=/usr/local --disable-file --without-pic --disable-shared
make
sudo make install

重新指向
echo "export PATH=/usr/local/curl/bin:$PATH" >> /etc/profile
刷新系统变量
source /etc/profile
再次查询 curl 版本
curl --version

curl 7.76.1 (x86_64-unknown-linux-gnu) libcurl/7.76.1 OpenSSL/1.1.1w zlib/1.2.7
Release-Date: 2021-04-14
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSocket

这里需要注意的是 curl 的版本号是否和 libcurl 一样,不一样则去浏览
vim /etc/ld.so.conf
资源库是否正确软连接

1
2
include /etc/ld.so.conf.d/*.conf
/usr/local/lib # 正确的curl的资源应该在此软连接到安装目录,64位系统为lib64

更改完毕记得刷新配置文件
sudo ldconfig -v
sudo ldconfig
同时注意有无出现 WARNING

记录问题

Q: curl: symbol lookup error: curl: undefined symbol: curl_mime_free
Q: curl: symbol lookup error: curl: undefined symbol: curl_url_cleanup
Q: curl: symbol lookup error: curl: undefined symbol: curl_url
这类问题是 libcurl 软连接缺失,建议先去确认/usr/local/lib 等地方的 libcurl.so 文件是否链接到正确的地方。

1
2
3
4
5
6
sudo ldconfig -v
# ***
#/usr/local/lib:
# libcurl.so.4 -> libcurl.so.4.4.0
# libpcre.so.1 -> libpcre.so.1.2.10
# 打个比方这里的libcurl就是错误链接了,理应是/usr/local/curl/lib/libcurl.so.4.7.0