ATOM Camで手軽にゲフンゲフン

# 概要
SDカードにファイルを置くだけで手軽に任意のコマンドを実行できる方法を紹介します。イメージの書き換えやルートパスワードは必要ありません。各自楽しんでください〜。悪用はダメですよ。

[これ](https://qiita.com/Dmitrievich/items/72fc7d200375d0526d4a)の続編です。
[こんな記事](https://honeylab.hatenablog.jp/entry/2020/05/01/112933)も出ていますね。awsのg3s.xlargeインスタンスでおなじことを試みると30分かそこらでできますね。ルートパスワードが欲しい人は参考するとよいです。

（追記） この記事はバージョン4.33.1.26のファームウェアで検証しています。

# やり方
１つ目のパーティションがexFatでフォーマットされているSDカードを用意してください。１つ目のパーティションのルートディレクトリに、次のように作成したTest.tarを置いて普通に起動するだけです。出荷前テストか何かで使うつもりで作ったバックドアなんですかね？　

## Test.tarの作成
```
mkdir work  # 作業フォルダ
cd work
touch factory
mkdir Test
touch Test/factoryTestProcess
touch Test/singleBoadTest  # 誤字ではありません。
touch Test/checksum
# ここで次節で説明するような Test/test.sh を作成します。
chmod a+x Test/test.sh
tar cfv Test.tar Test factory
```

自分は全てのファイルとディレクトリのオーナーをrootで作成しました。

## test.sh
順番が前後しましたが、次のようなtest.shを作って、Test.tarに入れ込んでください。

```
#!/bin/sh

echo "========== It works! ==========="
/system/bin/hl_client &
/system/bin/iCamera_app &

# you can write anything you want to do here.
```

このスクリプトは echo でちょっとシリアルコンソールに表示を出すだけで、通常動作とおなじようにアプリを立ち上げています。なお、アプリを立ち上げないとウォッチドッグでリブートするので、アプリを立ち上げない場合には対策をしないといけません。

あとは、この test.sh にやりたい放題かけばよいです。なお、rootfsはsquashfsなのでreadonlyです。試していませんが、SDカードの２つ目のパーティションをext4か何かで作っておいて、test.shからマウントしてやったりすれば、なんでもできちゃいますね。あとは、リバースシェルとかおしゃれかも。

## ブートログによる動作確認
うまくいくと、つぎのようなメッセージがブートログ上で確認できます。前編に掲載したブートログ全体と比べると、どこらへんで出るのか分かります。

```
===========welcome to assis process=========
[Build date] Mar 27 2020 (20:44:53)
[threadpool,0132](init_job_node) jobNodeNumMin:6 jobNodeNumMax:9
[exec-assis:144]: msgSndId:0
[exec-assis:159]: msgRcvId:32769
[SDK-DOG]dbg: turn on watchdog success!
[watchdog.c|assis,0051](assis_wdg_init) OK!
[FC] step3 trigger cd pin
[    4.024571] jzmmc_v1.2 jzmmc_v1.2.0: card removed, state=0
[    4.030293] mmc0: card 1234 removed
[    4.524576] jzmmc_v1.2 jzmmc_v1.2.0: card inserted, state=0
[    5.640082] mmc0: SD Status: Invalid Allocation Unit size.
[    5.649418] mmc0: new high speed SDXC card at address 1234
[    5.656972] mmcblk0: mmc0:1234 SA64G 57.9 GiB 
[    5.663052]  mmcblk0: p1
[    6.343636] [EXFAT] trying to mount...
[    6.403105] [EXFAT] mounted successfully
Test/
Test/singleBoadTest
Test/test.sh
Test/factoryTestProcess
Test/checksum
factory
[FC] Test.tar exist
get_uploadfile_md5:[59][d41d8cd98f00b204e9800998ecf8427e  /tmp/Test/singleBoadTest
]
get_uploadfile_md5:[63][d41d8cd98f00b204e9800998ecf8427e  /tmp/Test/factoryTestProcess
]
[FC] IN factory mode!
========== It works! ===========

===========welcome to iCamera_app===========
```

## 無線開通
wlan0を開通する test.sh の例です。

```
#!/bin/sh

echo "========== It works! ==========="
#/system/bin/hl_client &
/system/bin/iCamera_app &

# you can write anything you want to do here.

ifconfig wlan0 up
wpa_supplicant -D nl80211 -iwlan0 -c /tmp/Test/wpa.conf & 
sleep 3
udhcpc -i wlan0 

while true;
do
    ifconfig wlan0
    sleep 3
done
```

hl_clientは立ち上げなくてもwatchdogが発火しないので、とりあえずコメントアウト。

以下のような内容のwpa.confをtesh.shと並置し、中でSSIDとパスフレーズを書きます。パスフレーズを平文で置くのが嫌な人はちゃんとやってください。なお、test.sh が /tmp/Test/wpa.conf を参照しているのは、Test.tar が /tmp/ で展開されるからです。

```
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
	ssid="自分のSSIDを書いてください"
	key_mgmt=WPA-PSK
	pairwise=CCMP TKIP
	group=CCMP TKIP WEP104 WEP40
	psk="自分のパスフレーズを書いてください"
	scan_ssid=1
	priority=2
}

```

IPアドレスがコンソールに表示されます。なお、デフォルトでtelnetdが上がっています。

# BusyBox
busyboxに含まれているコマンド一覧です。リンクがあるのに実際にはないコマンドがあるのでハマりました。たとえばncのリンクがありますが実際には入っていないです。

```
arping
ash
awk
blkid
cat
chmod
chown
cp
cut
date
dd
depmod
devmem
df
dhcprelay
diff
dirname
dmesg
dnsd
dnsdomainname
du
dumpleases
echo
egrep
env
false
fdflush
fdformat
fdisk
fgrep
find
flash_eraseall
flashcp
flock
free
freeramdisk
fsync
getopt
getty
grep
groups
gunzip
gzip
halt
head
hostid
hostname
hush
hwclock
id
ifconfig
init
insmod
kill
killall
killall5
klogd
linux32
linux64
linuxrc
ln
logger
login
logread
ls
lsmod
lsof
lsusb
makedevs
md5sum
mdev
mkdir
mkdosfs
mkfs.vfat
mknod
mkswap
mktemp
modinfo
modprobe
mount
mountpoint
mv
netstat
nslookup
pgrep
pidof
ping
pkill
pmap
poweroff
printf
ps
pstree
pwd
readahead
readlink
reboot
rev
rm
rmdir
rmmod
route
sed
seq
setarch
sh
sleep
sort
sum
swapoff
swapon
switch_root
sync
sysctl
syslogd
tail
tar
telnetd
time
timeout
top
touch
tr
true
tty
ttysize
udhcpc
udhcpd
umount
usleep
vi
vlock
watch
watchdog
wc
wget
whois
xargs
zcat
```

# Telnetd
ATOMCamにインストールされている telnetd の引数一覧は次のとおりです。`telnetd -l /bin/sh -p 8023` とかいかがでしょうか。

```
Usage: telnetd [OPTIONS]

Handle incoming telnet connections

        -l LOGIN        Exec LOGIN on connect
        -f ISSUE_FILE   Display ISSUE_FILE instead of /etc/issue
        -K              Close connection as soon as login exits
                        (normally wait until all programs close slave pty)
        -p PORT         Port to listen on
        -b ADDR[:PORT]  Address to bind to
        -F              Run in foreground
        -i              Inetd mode
        -w SEC          Inetd 'wait' mode, linger time SEC
        -S              Log to syslog (implied by -i or without -F and -w)
```

# おわりに
すぐにファームアップデートで対策されちゃうでしょうね。賞味期限切れにご注意。