自爆裝置

每個黑黑家中都該有一套

First head with Raspberry Pi GPIO

Ethen @ 2015/04/28

身為一個

正直有為、剛正不痾、光明磊落、憂國憂民、紳士風度的好青年...

偶而遇到這種事情也是很合理的...

為了保護智慧財產權,避免謎片在法庭被公開播放,

自然應該做好萬全的準備

什麼東西,可以在緊急時刻把東西變不見?

這種怪東西,

日本人當然當仁不讓

的一聲是能搞毛..

然後門外的就全衝進來了

身為一個Hacker,創造力當然是必備條件!

是時候來做點好玩的惹

場景

門外一群黑衣人等著查水表,

你只有五到十秒的應變時間,

除了把手上的MAC塞進冰箱(?),還有桌邊的NAS、學校的伺服器,日本的跳板,美國的VPS...該怎麼辦?

先定義需求:

開發目標:緊急時刻快速破壞資料,盡量增加資料復原的困難性

操作性:可快速啟動、但又不會誤觸

目標系統:VPS / Server / NAS

                 => Unix&Mac 包含遠端主機

摧毀範圍:本地磁碟、執行中程序資訊

 

快速銷毀的方案

 

dd all hard-drive

dd disk header

format

rm -rf /

 

大絕

加密檔案系統:

把key抹掉超快超有效,

但加密要跑很久,還要動架構

折衷一下...

先dd 蓋掉header,

再跑format蓋掉super block,

然後進行完整dd

fdisk -l | grep Disk | grep \/dev\/ | cut -d' ' -f 2 \
 | cut -d':' -f1 > /tmp/localdrives

echo Erasing header:
for OUTPUT in $(cat /tmp/localdrives)
do
  dd if=/dev/zero of=$OUTPUT bs=512 count=1 conv=notrunc
done
echo Erasing all drive:
for OUTPUT in $(cat /tmp/localdrives)
do
  dd if=/dev/zero of=$OUTPUT bs=512 conv=notrunc &
done

恩?format呢?

看來我們不能直接Format Root FileSystem...

只能乖乖跑dd了嗎?

理想方案

A. 加密檔案系統,亂數抹掉key立即重開

B. 自製initrd,強制系統啟動進ramdisk後,格式化,然後對磁碟進行抹除

TBD....

回顧一下場景....

門外一群黑衣人等著查水表,

你只有五到十秒的應變時間

除了把手上的MAC塞進冰箱(?),還有桌邊的NAS、學校的伺服器,日本的跳板,美國的VPS...該怎麼辦?

寫個Script自動跑?

一行命令,五秒內應該來得及對吧?

OOPs...

一堆Private Key放在那裡,

被攻破就GG惹~

還有別忘了手殘敲錯命令的機率

如果被斷水斷電斷網路怎麼辦?

最好...

實體隔離

平常不會碰到

緊急時可以快速啟動

最好可以接3G網路跟緊急電源

......

Raspberry Pi - 超小型單板電腦

Spec:

Prize 35 USD

CPU Broadcom BCM2835 700+MHz

RAM 512~1024M

Broadcom VideoCore IV @ 250 MHz

USB 2.0 / HDMI / S端子 / 音訊輸出 / Ethernet

SD / MicroSD as storage

8~17 GPIO Port

相同的場景,不同的結果

Live DEMO

How it works?

有人提到GPIO ?

GPIO Concept

簡單來說,就是一堆接腳,

可以用程式控制輸出或輸入

輸出 0 or 1

*輸出模擬類比訊號

輸入 0 or 1

*測量類比訊號

(RPi要靠Software PWM處理

所以,讓其中一隻接腳在接收到訊號的時候執行killer script就行惹~

很簡單吧?

簡易感測電路

電路圖

控制GPIO的方式

Linux Shell Script

echo 4 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio4/direction
echo 1 > /sys/class/gpio/gpio4/value
echo 0 > /sys/class/gpio/gpio4/value
echo 4 > /sys/class/gpio/unexport

控制GPIO的方式

Python

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
while True:
  if(GPIO.input(23) ==1):
    print("Button 1 pressed")
GPIO.cleanup()

很簡單吧?

那..就來看Code吧

kill.sh

buttonAlarm.py

buttonAlarm.py

buttonAlarm.py

76行就解決惹~

結果Readme寫得比Code還長是哪招(汗

最後的組裝

把code放到Raspberry Pi,並且排入init開機時啟動

把Private Keys放進Pi中

關閉RPi的sshd, 配置防火牆阻止外對內連結避免入侵

配置檢查機制確定Pi還活著

在電源供應上用電池提供備用方案

準備3G作為斷網時備援線路

動手測試看看?

然後你的Server就通通清光光惹~

 

然後發現外面真的只是來查水表的,

可喜可賀可口可樂(?)

同場加映

'Mission Impossible'