Featured image of post 被 macOS 的各种奇怪问题折磨到最后终于打算用 Docker 的 Linux 容器了但是仅仅只是配置代理和共享文件夹就花去了这么多时间果然还是有点让人叹气呢 ~轻小说标题好像这么写的吧是说这两个波浪号~ 追加!!因为无法关闭 ASLR,Arch 酱竟然又————

被 macOS 的各种奇怪问题折磨到最后终于打算用 Docker 的 Linux 容器了但是仅仅只是配置代理和共享文件夹就花去了这么多时间果然还是有点让人叹气呢 ~轻小说标题好像这么写的吧是说这两个波浪号~ 追加!!因为无法关闭 ASLR,Arch 酱竟然又————

不想写各种正经的 pwn 练习题的做法了

放飞自我一下(


起因是我想试一下在 GitHub 上找到的 pwntools-ruby

试着执行了一下它的例子,但是很快啊,就这样了:

......
Could not open library 'keystone': dlopen(keystone, 0x0005): 
tried: 'keystone' (no such file), '/usr/local/lib/keystone' (no such file), 
'/usr/lib/keystone' (no such file), 
'/Users/senri/Downloads/keystone' (no such file). (LoadError)
......

原来是缺一个叫 keystone 的框架…那就试着装一下

❯ make install
/Library/Developer/CommandLineTools/usr/bin/make gen_const
cd .. && python const_generator.py ruby
/bin/sh: python: command not found
make[1]: *** [gen_const] Error 127
make: *** [install] Error 2

找不到 python…?

❯ sudo vim /etc/profile

alias python='python2'

❯ sh
sh-3.2$ python
sh: python: command not found

然后怎么改也没用…


其实上面几个连环问题并不是如此轻易的找到了解决办法,

就像走迷宫遇到一个分叉,走了几步发现是死路就又绕回来走另一个分叉,然后又遇到另一个分叉,进去转了一圈发现又是死路

不知道绕了多少弯路才终于遇到了刚刚那个 python 找不到命令的问题,心态有点炸

浪费了快两个小时….

总之弄了半天也没法让 /bin/sh 运行 python(可恶,而且是 python2,macOS 只自带 python3),然后终于打算不再折腾了…累了x

最后打算弄个 Docker 的容器跑 Linux 环境吧…

结果没想到这个决定反而更折腾了草


Arch Big Law is GOOD, Getting into the Pit as Soon as Possible Can Make You SAFE

这是很多年前水 Arch Linux 贴吧的时候经常见到的一句话(

「Arch 大法好,早日入坑保平安」

虽然很早就不看贴吧就是了

但还是想选 Arch,主要也就是为了 Pacman 和 Aur 吧

下载镜像很简单:

https://hub.docker.com/_/archlinux/

docker pull archlinux

说起来 Docker Desktop For Mac…好像还挺方便的

docker

然后就直接 docker 润 进去装了点必要的东西…想多开几个窗口一起弄结果发现

草 我刚刚装上的 Vim 呢,刚刚还在这的,那么大一个 Vim 呢

去查了一下才终于弄懂了 Image 和 Container 的概念…大概可以类比成 Java 里的 Class 和 Class 的一个实例

What is the difference between a Docker image and a container?

总之直接 docker run 的话是创建了一个新的 Container,并不会对 Image 造成改动,再 docker run 的时候又创了一个新的 Container,所以 Vim 没了…

那就正式创建一个新的 Container 以后一直用下去好了…

new container

取名叫 arch_linux_chan…那 Arch 酱请多关照ww


Get Proxy or You Can’t Get Out

是在捏他美版任天堂 N64 的广告x

Get N or Get Out

[root@102f567ae1e8 /]# sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 122 ms: Connection refused

草,GitHub 又被墙了

gfw,你做的好,你做的好啊

只好先弄一下代理…我平常用的是 Clash,复制终端代理命令的话是这样的:

export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

127.0.0.1:7890…点头,记下

1. Edit Config.json For ALL Containers

一开始查到的方法是在主机的 ~/.docker/config.json 下加入 proxy 的键值,像是这样:

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:7890",
     "httpsProxy": "http://127.0.0.1:7890",
     "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
   }
 }
}

When you create or start new containers, the environment variables are set automatically within the container.

试一下

说起来,run 的时候一定要加上 -d,指 detach

默认情况下容器没任何任务的时候就会直接退出

所以需要加上 -t 参数让它保持运行

❯ docker run -td --name="arch_chan_remastered" archlinux
5a6d0958894c8df8cbc70800f524a9d2172b1a3a889ad9df38302eab51134fed

❯ docker exec -it arch_chan_remastered bash
[root@5a6d0958894c /]# echo $HTTP_PROXY
http://127.0.0.1:7890

[root@5a6d0958894c /]# curl github.com
curl: (7) Failed to connect to 127.0.0.1 port 7890 after 0 ms: Connection refused

诶…

连接被拒…

为什么…

失敗した…

失敗した失敗した失敗した失敗した失敗した……

ゴメン ゴメン

こんな人生は、無意味だった。

(草

可能你已经发现了问题….因为我写的代理服务器地址是…是 127.0.0.1:7890….

127.0.0.1 是本机回环啊…

好笨…

哭…


True Method When You Use Clash…

总之如果你用的是是 Clash,应该这样配置:

clash

首先,一定把「Allow connect form Lan」选上

然后查看本机 ip:

❯ ifconfig
......
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=400<CHANNEL_IO>
	ether dc:a9:04:91:97:58
	inet6 fe80::10bf:598:79bc:82cf%en0 prefixlen 64 secured scopeid 0x6
	inet 192.168.1.5 netmask 0xffffff00 broadcast 192.168.1.255
......

本机 ip 是 192.168.1.5,Clash 的混合代理端口是 7890 那么就写 192.168.1.5:7890

❯ more ~/.docker/config.json
{
  "proxies":{
    "default":{
      "httpProxy": "http://192.168.1.5:7890",
      "httpsProxy": "http://192.168.1.5:7890"
    }
  }
}

(不太清楚 Clash 里的那个外部控制器 127.0.0.1:9090 是什么意思…以后再看吧


2. Edit .zshrc For ONE Container

以及,当时 Senri 并没有意识到自己是笨蛋,所以就换了一个方法继续…

是在这时候才意识到前面自己一直在用 127.0.0.1…然后才换到了 192.168.1.5

# 这是在容器里面
# 确认一下 --proxy 192.168.1.5:7890 能让自己出去
[root@5a6d0958894c /]# curl --proxy 192.168.1.5:7890 ipinfo.io
{
  "ip": "-抹掉了-",
  "hostname": "-抹掉了-",
  "city": "Hong Kong",
  "region": "Central and Western",
  "country": "HK", # 好耶,出去了
  "loc": "-抹掉了-",
  "org": "-抹掉了-",
  "timezone": "Asia/Hong_Kong",
  "readme": "https://ipinfo.io/missingauth"
}

弄个 Alias,在 .zshrc 或者 .bashrc 下面加入这句

alias start_proxy="export https_proxy=http://192.168.1.5:7890 http_proxy=http://192.168.1.5:7890"

以后 start_proxy 就快速出境了


Folder. It’s in my homedir

folder.png

总是用 docker cp 的话有点不方便,所以想弄个共享文件夹

但查了半天,他们创建共享文件夹都只有 run 一个新的 Container,

有点舍不得现在的 Arch 酱容器,但是…

Volume mounts occur only at container creation time. That means you cannot change volume mounts after you’ve started the container.

Volume 只能在创建容器的时候挂载…

只好…只好忍痛鲨了 Arch 酱…

然后…再造一个新的…

docker run -td --name="容器的名字" -v "主机的文件夹路径:容器的文件夹路径" 镜像的名字

我想把共享文件夹都放在根目录的 /share 下,但遇到了个奇怪的问题,所以姑且也记下来

直接 mkdir 是做不到的:

❯ sudo mkdir /myfolder
mkdir: /myfolder: Read-only file system

唯一的办法是创一个软链接:

❯ sudo vim /etc/synthetic.conf

# 加入这句:
根目录下的文件夹名字 「一个制表符」 实际的路径(开头不要斜杠)

# 比如:
share   Users/senri/share

# 重启之后的效果:
❯ more /etc/synthetic.conf
share   Users/senri/share

❯ ls -al /share
lrwxr-xr-x  1 root  wheel  17 May 19 07:58 /share -> Users/senri/share

还有….还有…一定得是一个制表符

空格是没用的….

谁想出来的大聪明设计…

总之前面那句命令对我来说就是:

docker run -td --name="arch_chan_mk2" -v "/share:/share" archlinux
e9f4244ff4ae3ca35057754e7fa93a9b4b2b9f774e71441b26f961bf902cc4ee

❯ touch /share/HelloArch

❯ docker exec -it arch_chan_mk2 bash
[root@e9f4244ff4ae /]# ls /share
HelloArch

成功w~


总之终于是…弄完了…

完全没有 Docker 基础真的是四处碰壁

叹气…但现在至少有一个好用的 Arch 环境了,能走代理也能和主机共享文件夹

接下来是每个喜欢秀桌面的 Linux 用户的传统艺能ww

screenfetch.png

啊但是为什么 macOS 这边的 Screenfetch 只显示一个 UNIX 啊…

查了下好像现在大家都开始用 neofetch 了么…

试一下…

neofetch.png

好耶

很开心x

(无数个被鲨死的 Arch 容器酱可能不开心…啊不过无所谓了


结果又遇到了奇怪的问题

追加了以下内容:

My name is Address space layout randomization, but everybody calls me ASLR

标题是捏他了一个完全让我无法理解的 meme

https://knowyourmeme.com/memes/my-name-is-giovanni-giorgio

总之…总之我在 gdb 的时候遇到了这样的问题:

[root@657cbae0b439 share]# gdb ./start
......
Reading symbols from ./start...
(No debugging symbols found in ./start)
(gdb) r
Starting program: /share/start

warning: Error disabling address space randomization: Operation not permitted

发生什么事了

看起来是没关掉 ASLR…

[root@657cbae0b439 share]# echo 0 | tee /proc/sys/kernel/randomize_va_space
tee: /proc/sys/kernel/randomize_va_space: Read-only file system
0

[root@657cbae0b439 share]# cat /proc/sys/kernel/randomize_va_space
2

[root@657cbae0b439 share]# whoami
root

关不掉诶..不理解

查了一下,似乎在调试线程的时候好像也会报错 ptrace: Operation not permitted.

这是 Docker 的问题,必须得加几个选项:

--security-opt list: Security Options

这里的话,把 seccomp=unconfined 加上

seccomp 是一个类似白名单的东西,规定了只有哪些 SYSCALL 能用

https://docs.docker.com/engine/security/seccomp/

把 seccomp 关了之后,ASLR 确实是可以关掉了

不过 ptrace 还不行…

上面的链接里的 Significant syscalls blocked by the default profile 节里有 ptrace,也就是不准用:

ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host.

…is already blocked by dropping CAP_SYS_PTRACE,所以还得再指定一次

使用这个参数:

--cap-add list: Add Linux capabilities

sys_ptrace 加上

所以最后是:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -td --name arch_chan_v3 -v "/share:/share" archlinux

依然只能在开新容器的时候指定呢…所以 Arch 酱…好惨…

gdb 能用了,但是死掉的 Arch 酱又多了一只,这一切都值得么

arches.png