Skip to content

Commit

Permalink
3.0.55
Browse files Browse the repository at this point in the history
  • Loading branch information
rev1si0n committed Dec 14, 2022
1 parent 6948291 commit 059e75a
Show file tree
Hide file tree
Showing 18 changed files with 161 additions and 188 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
3.0.53
* 修复宽字符请求头导致的崩溃
* 合并 mitmweb 到 startmitm 进程
* docker 镜像小修改
* 支持布局检视

3.0.50
* 支持 child, sibling 选择器

Expand Down
33 changes: 16 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
* 内置 crontab 定时任务
* 内置 Python3.9 及部分常用模块
* WIFI 远程桌面(web)
* 界面布局检视

同时,tools/ 目录下还包含了一些常用的脚本以及开箱即用的服务。

Expand All @@ -52,6 +53,13 @@

![中间人流量分析动图演示](image/mitm.gif)

## 界面布局检视

可在远程桌面即时检视安卓应用的界面布局用以编写自动化代码,在远程桌面按下 `CTRL + I` 即可进入模式,
按下 `CTRL + R` 刷新布局,再次按下 `CTRL + I` 退出。

![界面布局检视](image/inspect.gif)

## 通过代码自动化

直接通过代码点点点,可以替代大部分手动操作。
Expand Down Expand Up @@ -676,7 +684,7 @@ frida -H 192.168.0.2:65000 -f com.android.settings --certificate /path/to/lamda.
注意这与你在 linux 使用 crontab 并不相同,在 linux 正常使用 `crontab -e` 命令
来编辑任务,但是框架并未提供此命令,你需要直接编辑文件来写入规则(道理是相同的,都是编辑文件而已)

现在,请打开 web 控制台或者连接设备的 ssh,执行命令 `cd` 来切换到家目录。
现在,请打开 web 控制台或者连接设备的 ssh/adb shell,执行命令 `cd` 来切换到家目录。
此时家目录中有个名为 crontab 的文件夹。执行命令 `busybox vi crontab/jobs`,你将进入编辑文件,在英文输入模式下按下字母 `i`,随后写下相关规则,并按下 `ESC``SHIFT` + `:`,输入 `wq` 并按下回车来保存。你可以在这个 jobs 文件中写入多行,同样,你也可以在这个文件夹下创建其他名字的规则文件。

如果你还是不懂怎么编辑,请在电脑编辑完成后使用adb转移到此目录。
Expand Down Expand Up @@ -759,7 +767,7 @@ fwd.protocol=tcp
fwd.enable=true
```

进入设备的 ssh 命令行(也可通过 web 远程桌面拖拉上传文件),执行
进入设备的 ssh 或者内置 adb 命令行(也可通过 web 远程桌面拖拉上传文件),执行

```bash
cd # 先切换到家目录
Expand Down Expand Up @@ -1284,20 +1292,9 @@ d.wait_for_idle(5*1000)

> Selector

界面选择器,类似于网页,安卓的界面也可以通过选择器进行元素的选择。
在开始了解前,请先安装第三方的 [alibaba/web-editor](https://github.com/alibaba/web-editor),你可以通过
```bash
pip3 install weditor
```
直接安装。

随后,在命令行输入 `weditor` 启动,你会自动跳转到相关页面,在顶部连接设备区域输入 `设备IP:65000` 并点击 CONNECT 进行连接。
注意,暂仅支持其UI审查功能,请不要使用右侧代码运行/实时等功能。

连接到设备后,点击 `Dump Hierarchy` 来获取当前界面布局,你可以将其想象成打开了开发者工具并得到DOM布局。

这样,你可以在左侧页面屏幕上选择你感兴趣的元素,在页面中部 `Selected Element` 区域将会显示其属性。
你可以将其中的大部分属性作为 Selector 的参数。
界面布局检视,首先你需要打开设备的 web 远程桌面。随后,鼠标点击左侧屏幕确保焦点落在投屏上(否则焦点可能会被右侧的终端捕获),
然后按下快捷键 `CTRL+I`(启动布局检视),此时你将不能再滑动左侧屏幕,你可以点击屏幕上的虚线框来查看对应元素的信息,你可以将其中的部分属性作为 Selector 的参数。
再次按下 `CTRL+I` 将关闭布局检视,布局检视并不会随着页面的改变而刷新,它始终是你按下快捷键那一刻的屏幕布局,如果需要刷新布局请手动按下快捷键 `CTRL+R`

正常情况下,我们只会使用 `resourceId`, `clickable`, `text`, `description` 作为参数。
如果元素存在正常的 resourceId,优先使用其作为 Selector,即:`Selector(resourceId="com.android.systemui:id/mobile_signal_single")`
Expand All @@ -1306,6 +1303,8 @@ description 与 text 同理,但是 description 用的会比较少。

当然,Selector 不止可以使用一个参数,你可以做其他组合,例如 `Selector(text="点击进入", clickable=True)`

> 注意:很少直接用 Selector(),大部分情况下,使用 d() 来进行。

所有常见的匹配参数:

```
Expand Down Expand Up @@ -1590,7 +1589,7 @@ d._release_lock()

## 如何使用内部终端

这里的内部终端,指的是你通过 web 远程桌面或者 ssh 连接的终端,里面内置了一些命令以及Python模块,你可以
这里的内部终端,指的是你通过 web 远程桌面或者 ssh/内置adb 连接的终端,里面内置了一些命令以及Python模块,你可以
直接在里面执行一些操作或者运行一些 Python 代码。

现在假设你已经打开了 web 远程桌面,你应该已经在页面上看到了一个 linux 终端。
Expand Down
Binary file added image/inspect.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion lamda/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
# Distributed under MIT license.
# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
__version__ = "3.0"
__build__ = 50
__build__ = 55
9 changes: 6 additions & 3 deletions lamda/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import atexit
import grpc

from urllib.parse import quote
from collections import defaultdict
from os.path import basename, dirname, expanduser, join as joinpath
from grpc_interceptor import ClientInterceptor
Expand All @@ -38,7 +39,6 @@

logger = logging.getLogger("lamda")
FORMAT = "%(asctime)s %(process)d %(levelname)7s@%(module)s:%(funcName)s - %(message)s"
logging.basicConfig(format=FORMAT)

sys.path.append(joinpath(dirname(__file__)))
sys.path.append(joinpath(dirname(__file__), "rpc"))
Expand Down Expand Up @@ -252,7 +252,7 @@ def intercept(self, function, request, details):
metadata = {}
metadata["version"] = __version__
metadata["instance"] = self.get_instance_ID()
metadata["hostname"] = platform.node()
metadata["hostname"] = quote(platform.node())
metadata["python_branch"] = platform.python_branch()
details = details._replace(metadata=metadata.items())
res = function(request, details)
Expand Down Expand Up @@ -1777,8 +1777,11 @@ def device_info(self):
return self.stub("UiAutomator").device_info()
def __call__(self, **kwargs):
return self.stub("UiAutomator")(**kwargs)
def setup_log_format(self):
logging.basicConfig(format=FORMAT)
def set_debug_log_enabled(self, enable):
logger.setLevel(logging.DEBUG if enable else logging.WARNING)
level = logging.DEBUG if enable else logging.WARN
logger.setLevel(level)
return enable
# 接口锁定
def _acquire_lock(self, leaseTime=60):
Expand Down
18 changes: 13 additions & 5 deletions tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,9 @@ test.pem # 用于加密客户端与服务端通信的证书
它可以自动应用及撤销中间人,退出脚本后设备及网络也将恢复它原来的样子。

> 提示:有时在 Windows 上装这些东西是很烦的事情,
> 所以专门为 Windows 提供了一个 **startmitm-standalone.zip**包含了两个**Windows 命令行程序**将其解压到相同目录即可
> 它的参数与 startmitm.py 相同。这样你可以不用安装 Python 及其相关环境。你可以在每个版本的 release 中找到它。如果没有,可以翻看稍旧的 release。
> 对于 Linux/Mac 用户,如果你想生成/使用这种独立可执行程序,请自行使用 `pyinstaller startmitm-standalone.spec` 命令打包
> 所以专门为 Windows 提供了 **startmitm.exe**这是一个**Windows 命令行程序**将其下载并放入系统 PATH 或者当前目录,在命令行执行即可
> 它的参数与 startmitm.py 相同。这样你可以不用安装 Python 及任何相关环境,但是你也只能进行基本的中间人操作。你可以在每个版本的 release 中找到它。如果没有,可以翻看稍旧的 release。
> 对于 Linux/Mac 用户,如果你想生成/使用这种独立可执行程序,请自行使用 `pyinstaller startmitm.spec` 命令打包
> (需要安装 pyinstaller)。
> 如果你需要对国际APP进行中间人,请转到 **globalmitm**
Expand All @@ -99,7 +99,7 @@ test.pem # 用于加密客户端与服务端通信的证书

当然,电脑与设备不在同一网段或者是远程设备,你也可以轻松 mitm,请继续看下去。

> 注意:mitmweb 并不适合长时间多请求,其截获的请求均存储于内存之中。所以在长时间使用的情况下你的内存会被吃光。
> 注意:mitmweb 并不适合长时间多请求,其截获的请求均存储于内存之中。所以在长时间使用的情况下你的内存会被吃光(你可以不定期点击 mitmweb 界面的左上角 File->Clear All 来释放)
> 对于长时间的中间人操作,请改用 mitmdump,请自行了解使用方法。
执行
Expand All @@ -109,13 +109,21 @@ python3 -u startmitm.py 192.168.1.2
```
即可。

如果你想和局域网的小伙伴一起分析

```bash
python3 -u startmitm.py 192.168.1.2 --web-port 7890 --web-host 0.0.0.0
# 然后,让你的小伙伴用浏览器打开 http://你的IP地址:7890 即可
```

如果需要截获特定应用的流量而不是全局
```bash
# 这里的 com.some.package 是应用的 ID
python3 -u startmitm.py 192.168.1.2:com.some.package
```
即可。


如果你想使用特定的DNS,或者一些情况下,你可能出现DNS解析错误/无法解析的情况(可能出现于一些原生的系统),可以这样做

```bash
Expand Down Expand Up @@ -202,7 +210,7 @@ python3 -u startmitm.py 192.168.1.2 --mode upstream:example.com:8080 --upstream-
python3 -u startmitm.py 192.168.1.2 --dns
```

> 指定上游 DNS 为 114.114.114.114
> 指定上游 DNS 为 114.114.114.114(如果在中国大陆,建议使用如下命令指定DNS)
```bash
python3 -u startmitm.py 192.168.1.2 --dns 114.114.114.114
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,49 @@
#include "stdafx.h"
// "stdafx.h"
#ifndef _STDAFX_H
#define _STDAFX_H

#ifdef _WIN32

//Windows specific includes
#define WINVER 0x501
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <time.h>
#include <stdint.h>

#else //#ifdef _WIN32

//other OS includes and some tricks to fake Win32 API
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
typedef int SOCKET;
#define SOCKET_ERROR (-1)
#define closesocket(hSock) close(hSock)
#define WSAGetLastError() errno
#define CRITICAL_SECTION pthread_mutex_t
#define InitializeCriticalSection(criticalSection) pthread_mutex_init(criticalSection, NULL)
#define EnterCriticalSection(criticalSection) pthread_mutex_lock(criticalSection)
#define LeaveCriticalSection(criticalSection) pthread_mutex_unlock(criticalSection)

#endif //#ifdef _WIN32

#endif //#ifndef _STDAFX_H

// end "stdafx.h"

//helpful URLs:
// http://www.networksorcery.com/enp/protocol/dns.htm
Expand Down
1 change: 0 additions & 1 deletion tools/globalmitm/DNS2SOCKS/README.md

This file was deleted.

1 change: 0 additions & 1 deletion tools/globalmitm/DNS2SOCKS/stdafx.c

This file was deleted.

43 changes: 0 additions & 43 deletions tools/globalmitm/DNS2SOCKS/stdafx.h

This file was deleted.

36 changes: 17 additions & 19 deletions tools/globalmitm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,29 @@ FROM debian:bullseye-slim

LABEL maintainer="rev1si0n <[email protected]>"

ENV PYPIMIRROR=https://mirrors.ustc.edu.cn/pypi/web/simple
ENV GOST=https://github.com/ginuerzh/gost/releases/download/v2.11.4/gost-linux-386-2.11.4.gz
ENV SOURCESMIRROR=mirrors.ustc.edu.cn
ENV VERSION=2.11.4
ENV PLAT=linux-386

RUN sed -i "s/deb.debian.org/${SOURCESMIRROR}/g" /etc/apt/sources.list
RUN sed -i "s|security.debian.org/debian-security|${SOURCESMIRROR}/debian-security|g" /etc/apt/sources.list
ENV PYPIMIRROR=https://mirrors.ustc.edu.cn/pypi/web/simple
ENV GOST=https://github.com/ginuerzh/gost/releases/download/v${VERSION}/gost-${PLAT}-${VERSION}.gz
ENV BINDIR=/usr/local/bin

RUN apt-get update && apt-get -y upgrade
RUN apt install -y adb gcc wget dnsutils python3 python3-pip
WORKDIR /tmp
RUN apt-get update && apt-get -y upgrade && apt install -y adb gcc wget dnsutils python3 python3-pip

RUN wget ${GOST} -O - | gzip -d> /usr/bin/gost
RUN wget ${GOST} -O - | gzip -d> ${BINDIR}/gost

COPY globalmitm/DNS2SOCKS /
RUN gcc DNS2SOCKS.c -o /usr/bin/DNS2SOCKS -lpthread
COPY startmitm.py ${BINDIR}
COPY globalmitm/entry ${BINDIR}
COPY globalmitm/DNS2SOCKS.c /tmp
COPY requirements.txt /tmp

COPY startmitm.py /usr/bin
COPY globalmitm/entry /usr/bin/mitm
COPY requirements.txt /
RUN gcc -pthread DNS2SOCKS.c -o ${BINDIR}/DNS2SOCKS
RUN pip3 install -i ${PYPIMIRROR} --no-cache-dir -r requirements.txt

RUN chmod 755 /usr/bin/gost
RUN chmod 755 /usr/bin/startmitm.py
RUN chmod 755 /usr/bin/mitm
RUN chmod 755 ${BINDIR}/*
ENV PATH=${BINDIR}:${PATH}

RUN pip3 install --no-cache-dir -i ${PYPIMIRROR} -r /requirements.txt
WORKDIR /root

EXPOSE 53/udp 8118/tcp 1234/tcp
ENTRYPOINT [ "mitm" ]
ENTRYPOINT [ "entry" ]
6 changes: 5 additions & 1 deletion tools/globalmitm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,8 @@ docker run -it --rm -p 8118:8118 -p 1234:1234 -e LANIP=192.168.0.2 rev1si0n/mitm
```bash
# cd 到 tools 目录
docker build -t rev1si0n/mitm -f globalmitm/Dockerfile .
```
```

### DNS2SOCKS

https://sourceforge.net/projects/dns2socks
2 changes: 1 addition & 1 deletion tools/globalmitm/entry
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ fi

trap "kill -9 ${PIDS} 2>/dev/null" SIGINT
if ! dig +time=3 google.com @127.0.0.1 -p ${PDNS}; then
die "PROXY NOT USABLE"
die "BAD PROXY (CANNOT RESOLVE THROUGH PROXY)"
fi

set -- "$@" --dns 127.0.0.1:${PDNS}
Expand Down
5 changes: 0 additions & 5 deletions tools/mitmweb.py

This file was deleted.

4 changes: 3 additions & 1 deletion tools/openvpn/ovpn-client-new
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#!/bin/bash
openvpn --genkey tls-crypt-v2-client "/etc/openvpn/tls-crypt-v2-client/$1" --tls-crypt-v2 /etc/openvpn/tls-crypt-v2-server.key
TC_CLIENT=/etc/openvpn/tls-crypt-v2-client/$1
TC_SERVER=/etc/openvpn/tls-crypt-v2-server.key
openvpn --genkey tls-crypt-v2-client ${TC_CLIENT} --tls-crypt-v2 ${TC_SERVER}
easyrsa build-client-full "$1" nopass
Loading

0 comments on commit 059e75a

Please sign in to comment.