不想写各种正经的 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 润
进去装了点必要的东西…想多开几个窗口一起弄结果发现
草 我刚刚装上的 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 以后一直用下去好了…
取名叫 arch_linux_chan
…那 Arch 酱请多关照ww
Get Proxy or You Can’t Get Out
是在捏他美版任天堂 N64 的广告x
[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,应该这样配置:
首先,一定把「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
总是用 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
啊但是为什么 macOS 这边的 Screenfetch 只显示一个 UNIX 啊…
查了下好像现在大家都开始用 neofetch 了么…
试一下…
好耶
很开心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 酱又多了一只,这一切都值得么