近期对数字货币挖掘(“挖矿”)有比较高的热情,主要以门罗币(Monero/XMR)及其衍生货币为主,因为它们被很多黑客作为攻击后主要挖掘的货币——其可以在CPU上挖掘,且对CPU运算效率速度无特别的要求,因此适用于大部分无显卡的服务器挖矿。同时,由于其超强的匿名性和不可追踪性,被广泛用于灰色交易当中。
在最近这一周,我主要把时间花在了门罗币挖矿软件XMRig及配套的矿工池XMRig-Proxy上,开发者主要通过捐赠以及挖矿软件的1%-5%的捐赠来获得回报。经过查询,在2020年1月7日时,捐赠矿工池地址donate.v2.xmrig.com:5555下其正在进行Sumokoin(使用CryptoNightR算法)的挖掘。
本文的主要内容有以下部分:
- 云端部署分布式矿工池及矿工;
- 无捐献矿工编译方法;
- 部分平台的静态矿工编译。
云端部署分布式矿工池及矿工
在之前一周的时间里,我主要在阿里云、亚马逊云(Amazon Web Services)以及微软云(Microsoft Azure Cloud)上尝试部署矿工池以及矿工应用,谷歌云(Google Cloud Platform)对挖矿软件的检测十分严格,同时可能存在对流量监控的问题,一旦发现挖矿的就直接封禁项目。
矿工池
由于中国大陆对世界最大的门罗币矿场supportXMR和mineXMR的连接速度有限,且丢包率较高,因此我选择了在海外服务器自建矿工池代理节点XMRig-Proxy,而后将矿工连接到自建矿工池节点,再将自建矿工池节点连接至矿场来提升连接的稳定性。
自建矿工池具有如下几个优势:
- 无需逐个配置矿工,只需要将矿工运行并且连接至矿工池即可;
- 不会在矿工设置文件中暴露钱包地址,只会暴露矿工池的IP地址(如果矿工池的流量经过转发,矿工池的IP地址也不会暴露),因此黑客可以安全地在任何入侵设备上挖矿;
- 通过修改矿工池的配置文件,可以统一调配所有连接的矿工执行特定的算法、开采特定的数字货币;
- 并发性能超高,在超低配置(1核1GB内存)的服务器上运行,同时连接的矿工数量能够超过10万;
- 矿场的同时连接数有限,一般单个钱包地址只允许100个矿工连接,通过矿工池作为代理,能够变相增加矿场允许连接矿工的数量;
- 矿工池可多级代理,即矿工池能够层层连接;
- 矿工池支持SSL证书,因此能够对传输数据进行加密及伪装,和正常HTTPS通信并无二致,能够绕开海外企业的数据监控(具体可参考谷歌云流量监控;
- 如果矿工池直接接入Tor网络,则矿场也无法回溯矿工池的IP地址,目前,已经存在暗网上的门罗币矿池RespectXMR以保证绝对的匿名性。
因此,将矿工连接到自建矿工池也成为了黑客在攻击后的首要选择。
矿工池部署
我部署了两个矿工池,香港、美国各部署一个,原因如下:
香港矿工池
- 主要矿场在新加坡都有子节点,香港至新加坡的连接延迟一般低于50ms;
- 中国连接香港的延迟(约70ms)远低于中国直连新加坡的延迟(约150ms),香港可以辐射整个泛太平洋地区的矿工。
美国矿工池
- 各个云服务商在美国地区提供的云服务价格最低,在美国建矿工池节约频繁的矿工配置时间。
矿工池的部署可以参考GitHub的Wiki以及XMRig-Proxy官方文档。
参考配置
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
{
"access-log-file": null, // 矿工连接记录
"access-password": null, // 矿工连接密码认证,null为关闭
"algo-ext": true,
"api": {
"id": null,
"worker-id": "Your Worker Name" // web端矿工池显示名称
},
"http": {
"enabled": true, // 是否开启矿工池web连接端口
"host": "0.0.0.0",
"port": 50001,
"access-token": "password", // web端连接密码
"restricted": true // 是否允许在web端修改矿工池配置文件
},
"background": false, // 是否在后台静默运行
// 入站数据监听端口
"bind": [
{
"host": "0.0.0.0",
"port": 443,
"tls": true
}
],
"colors": true,
"custom-diff": 0,
"custom-diff-stats": false,
"donate-level": 0, // 矿工池捐赠比例,可为0
"log-file": null, // 矿工池连接矿场的信息记录
"mode": "nicehash",
"pools": [
{
"algo": null,
"coin": "monero", // 目标数字货币
"url": "pool-hk.supportxmr.com:443", // 矿场地址
"user": "Your Wallet Address", // 连接矿场的用户信息,一般是钱包地址
"pass": null,
"rig-id": "Your Worker Name", // 矿场端矿工池显示名称
"keepalive": true,
"enabled": true,
"tls": true, // 是否通过HTTPS连接矿场
"tls-fingerprint": null
}
],
"retries": 3, // 断线重连,若有多矿场,断线多次会连接下一矿场
"retry-pause": 1,
"reuse-timeout": 0,
// HTTPS矿工池连接配置文件
"tls": {
"protocols": null,
"cert": "TLS Certificate", // TLS证书
"cert_key": "TLS Private Key", // TLS私钥
"ciphers": null,
"ciphersuites": null,
"dhparam": null
},
"user-agent": null,
"syslog": false,
"verbose": true,
"watch": true,
"workers": true
}
|
无捐献版本XMRig
获取XMRig源码后,在/src/donate.h
文件中将constexpr const int kMinimumDonateLevel = 1;
修改为constexpr const int kMinimumDonateLevel = 0;
即可。
静态XMRig编译
由于普通的动态编译版本是使用本机的支持库,直接指向本机支持库的地址,而不同设备下支持库的路径可能不同,因此可能导致软件无法运行的情况。选择对文件进行静态编译,静态编译后的文件将所有支持库融入文件当中,则可以在任何设备上都能够无差别运行,适合黑客大批量部署。
官方Release通道发布的版本均为静态编译文件,但是这些静态编译版本设定最低捐赠额度(每100分钟有最低1分钟/默认5分钟的挖矿时间捐赠给开发者),因此也并未给出详细的静态编译教程。
注意:由于我测试的矿机没有GPU,因此没有尝试任何AMD/NVIDA/CUDA的静态编译版本制作。
大部分服务器均为无GPU版本,因此下述编译方法应该也是大多数黑客所采用的,如果需要研究网络安全的部分,则应该仔细审查通过下述Linux静态编译方法编译出的二进制文件特征。
macOS静态编译方法
macOS由于系统标准化程度高,静态编译较为简单,可参考官方编译方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 下载XMRig最新源码
git clone https://github.com/xmrig/xmrig.git
# 进入XMRig地址
cd xmrig
# 下载Portable Hardware Locality (hwloc),用于识别CPU个数以自动调整挖矿效率
curl -O https://download.open-mpi.org/release/hwloc/v2.1/hwloc-2.1.0.tar.bz2
# 解压及编译hwloc
tar xjf hwloc-2.1.0.tar.bz2
cd hwloc-2.1.0
./configure --disable-shared --enable-static --disable-io --disable-libxml2
make -j $(sysctl -n hw.logicalcpu)
# 编译XMRig
cd ../build
cmake .. -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DHWLOC_INCLUDE_DIR=../hwloc-2.1.0/include -DHWLOC_LIBRARY=../hwloc-2.1.0/hwloc/.libs/libhwloc.a
make -j $(sysctl -n hw.logicalcpu)
|
Linux静态编译方法
Linux系统的发行版众多,静态编译较为复杂,我主要使用Ubuntu系统,因此本文将以Ubuntu系统为例讲解静态编译方法。
注意:该编译方法暂时不完全,未成功编译SSL支持库,仍需要后续尝试并且补全。
需要静态编译的支持库有以下几个部分:
- Portable Hardware Locality(已完成,已测试,参考Issue)
- libuv(已完成,待测试,参考官方编译方法)
- libssl(暂未开始尝试)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 下载编译所需要的支持库
sudo apt-get install git build-essential cmake libuv1-dev libssl-dev libhwloc-dev
# 下载XMRig最新源码
git clone https://github.com/xmrig/xmrig.git
# 下载并编译Portable Hardware Locality
cd ~
wget https://download.open-mpi.org/release/hwloc/v2.0/hwloc-2.0.4.tar.bz2
tar xjf hwloc-2.0.4.tar.bz2
cd hwloc-2.0.4
./configure --disable-shared --enable-static --disable-io --disable-libudev --disable-libxml2
make
# 设定build文件目录
cd xmrig && mkdir build && cd build
# 编译
cmake .. \
-DUV_LIBRARY=/usr/lib/x86_64-linux-gnu/libuv.a \ # libuv
-DHWLOC_INCLUDE_DIR=~/hwloc-2.0.4/include/ \ # hwloc include目录
-DHWLOC_LIBRARY=~/hwloc-2.0.4/hwloc/.libs/libhwloc.a # hwloc libhwloc.a文件
make
|
其它
谷歌云流量监控
我在谷歌云曾经部署过V2Ray代理作为流量中转,但由于谷歌云对免费容器的限制,我从未在上面部署过任何矿机。
然而,谷歌云在最近一周两次向我发送警告,声称检测到我在容器中进行挖矿。我的所有设备的非大陆段IP流量全部通过谷歌云中转,但从未在谷歌云上部署过矿机进行挖矿,因此,谷歌云极有可能对所有经过设备的流量进行监控。
出于安全考量,建议所有用户不要再使用谷歌云架设任何代理,尤其是通过明文传输的HTTP数据切勿再经过谷歌云。普通的代理主要起通道作用,安全性本身就远低于传统VPN,因此任何明文传输的数据都极容易被监听。
若无其他选择,架设后所有的数据也务必使用TLS加密。
JavaScript浏览器挖矿脚本
效果十分震撼,但时间有限暂未开始此部分写作。
捐赠
随波逐流,附一个XMR地址
8579JuUDatseeMWWSBzQwr8aBuq58RViLeFSS5xNHueL3vV8rFm2nSaU4oyVoF2v9eBzM4rMGWwaaTciKSs4cyuiD9PApL5