弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

DNSCryptで土人の伝家の宝刀「DNSスプーフィング」を封じ込めて民主主義を獲得できるのか?永田寿康議員自殺ホリエモン偽メール事件防止w update12

会社で何度もDNS参照で障害が起きているのでDNSスプーフィング対策を考えてみた。
dnscrypt.orgこれがよさげ。


    |----- 最も攻撃に対して脆弱な部分-----|            |-- 最も改ざんに対して脆弱な部分   --|
    |----- Most vulnerable to attacks ------|            |-- Most vulnerable to modification --|

         dnscrypt client                                                                                 dnscrypt server
PC/スマホ/タブレット→→→→→→→→→→家庭のルータ →→→ ISP →→→→ インターネット→→→ 公開DNSリゾルバ
Laptop/workstation/phone/tablet --------> home router --------> ISP ----------> the Internet --------> public DNS resolver

    |----------------------------------- Secured by DNSCrypt -------------------------------------------|
                                                                              |--- Secured by DNSSEC ---|
                                                                     |--- Most vulnerable to logging ---|
                                                                     |--- 最も盗聴に対して脆弱な部分---|
ネットに暗号化通信できるDNSサーバーを設置、
DNSCryptで暗号化通信を使うことで攻撃、改ざん、盗聴できない接続。
DNS参照をNTTにログ(盗聴)されない環境を構築。
感染プロキシ対策になるかも。
いやいや、不正選挙を防止できれば民主主義の夜明けですなw

DNSを使った名前解決は脆弱なDNS仕様に由来してる。 なのでHTTPSみたいに暗号化してスプーフィングやキャッシュポイズニング、改ざんを防ごうというアイデア。

おもしろいと思ったのはdnscryptクライアントにWindows版やAndroid版もあること。
めざせ民主主義。

libsodium-1.0.10.tar.gzが必要ライブラリ。

download.dnscrypt.org/dnscrypt-proxy/
へー。dnscrypt-proxy-1.6.1.tar.bz2 更新日付を見ると2016年2月3日ですな。

dnscrypt-proxy-1.6.1のconfigureに-hostオプションがいるかも。

$ ./configure -host=x86_64

# dnscrypt-proxy --ephemeral-keys --resolver-name=dnscrypt.org-fr --daemonize --local-address=127.0.0.1:5353
# dnscrypt-proxy --ephemeral-keys --resolver-name=d0wn-random-ns1 --resolvers-list=/somewhere/dnscrypt-resolvers.csv --daemonize --local-address=127.0.0.1:5353

デフォルトの53番ポートを5353にズラしてdnsmasqと共存できるようにする。

dnsmasq with dnscrypt-proxy

## Configure /etc/resolv.conf to use dnsmasq
nameserver 127.0.0.1

## Configure /etc/dnsmasq.conf
# ignore resolv.conf
no-resolv
# Listen only on localhost
listen-address=127.0.0.1
# dnscrypt is on port 40
server=127.0.0.1#40

dnsmasq-2.45-1.1.el5_3

no-resolv
server=127.0.0.1#5353
server=127.0.0.1#40はserver=127.0.0.1#5353かも。
RHEL5環境でもdnsmasq-2.65-1.el5.rfxまでバージョンアップできる。

dnsmasq-2.75-3.fc23.x86_64

#resolv-file=/etc/dnsmasq.resolv.conf
#nameserver 127.0.0.1 # bad option at line 30 of /etc/dnsmasq.conf
no-resolv
server=127.0.0.1#5353
proxy-dnssec
#listen-address=127.0.0.1,192.168.1.123 # 設定しないと 0.0.0.0:53
[05:40:03] Jun 15 05:40:03 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (304 data bytes)
[05:40:03] Jun 15 05:40:03 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (240 data bytes)
[05:40:06] Jun 15 05:40:06 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (304 data bytes)
[05:40:06] Jun 15 05:40:06 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (368 data bytes)
[05:40:11] Jun 15 05:40:11 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (304 data bytes)
[05:40:42] Jun 15 05:40:42 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (240 data bytes)
[05:41:10] Jun 15 05:41:10 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (432 data bytes)
[05:43:33] Jun 15 05:43:33 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (401 data bytes)
[05:43:54] Jun 15 05:43:54 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (240 data bytes)
[05:48:34] Jun 15 05:48:34 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 33176 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (187 data bytes)
[05:48:34] Jun 15 05:48:34 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (240 data bytes)
[05:49:12] Jun 15 05:49:12 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (304 data bytes)
[05:50:12] Jun 15 05:50:12 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (368 data bytes)
[05:52:26] Jun 15 05:52:26 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (401 data bytes)
[05:54:31] Jun 15 05:54:31 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (176 data bytes)
[05:59:03] Jun 15 05:59:03 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (368 data bytes)
[05:59:22] Jun 15 05:59:22 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (240 data bytes)
[05:59:32] Jun 15 05:59:32 UDP: dgram to 我が家2.localdomain (我が家LAN.11):port 35768 from ns2.random.dns.d0wn.biz (185.14.29.140):443 (304 data bytes)
こんなトラフィック。

#!/usr/bin/perl

killall dnscrypt-proxy

R=`grep -v "^Name" dnscrypt-resolvers.csv|perl -MList::Util -e 'print List::Util::shuffle <>'|head -1|awk -F, '{print $1}'`

echo "using dnscrypt-resolver [${R}]..."
dnscrypt-proxy --ephemeral-keys --resolver-name=${R} --resolvers-list=/somewhere/dnscrypt-resolvers.csv --daemonize --local-address=127.0.0.1:5353
dnscrypt-resolvers.csvからランダムに使うとか。

CyanogenModCM12.1に組み込まれてる。そーなのかぁ。

dnsmasq, serve different ip addresses based on interface used

While @kichik's answer may well work, a more elegant way to achieve the same might be to use the localise-queries directive and a single dnsmasq server instance.

I'll assume that you already configured your DHCP ranges for the different interfaces, and have bound dnsmasq to those.

Add the (partially documented) localise-queries option to your dnsmasq.conf file.

# /etc/dnsmasq.conf
localise-queries

Then, make sure that one of the files that dnsmasq reads for your hosts (such as /etc/hosts) contains entries with the IP addresses for both networks, like this:

# /etc/hosts
127.0.0.1      dev-vm
192.168.1.1    dev-vm
10.0.0.1       dev-vm

An alternative to changing the /etc/hosts file is to specify the addresses in your dnsmasq.conf file instead:

# /etc/dnsmasq.conf
localise-queries
host-record=dev-vm,127.0.0.1
host-record=dev-vm,192.168.1.1
host-record=dev-vm,10.0.0.1

As a result in both cases, dnsmasq will serve only the IP that matches the interface's IP and netmask for queries received on that particular interface.

According to the man page, this does the following: 
おぉぉ。dnsmasq.confにlocalise-queriesを定義して host-record=でホスト名とアドレスを羅列定義すると dnamasqはインターフェイスのIPとマスクにマッチするアドレスだけを応答するとゆー ローカライズ・クエリ機能。

Windows版もあるけど、会社LAN環境にはF/Wが導入されてるので使えないかも。 なのでOpenVPN経由でサーバのプロキシをリモートDNSで使うようにFirefoxを設定すれば、ブラウザの安全性チェーンは確保できるんじゃね?w

Android版(i686/armv7)のdnscrypt-proxyをxdaで見つけーた。
dnscrypt-proxy-android-i686.zip - [Click for QR Code] (379.0 KB, 78 views)
dnscrypt-proxy-android-armv7-a.zip - [Click for QR Code] (371.4 KB, 200 views)

この.zipファイルTWRPで導入できそうだけど、i686の.zipは/systemの更新に失敗してハングアップしてしまうw
dnscrypt-proxy-android-i686.zip#etc/init.d/99dnscryptはこんなかんじで起動していた。 Androidがおかしくなるのは dnscrypt-proxyが起動してないのにiptablesで53番ポートをNAT設定してしまいDNS参照がハングアップしてしまうから。
&&でコマンドをつないだのが失敗。

ぶっへー、そんなことよりiptablesて53番ポートのトラフィックにインターセプトして127.0.0.1に転送するNAT設定なんてできるんだ。

#!/system/bin/sh

RESOLVER_NAME=dnscrypt.org-fr

dnscrypt-proxy \
  --resolver-name="$RESOLVER_NAME" \
  --resolvers-list=/system/etc/dnscrypt-proxy/dnscrypt-resolvers.csv \
  --test=3600 && \
dnscrypt-proxy \
  --daemonize \
  --loglevel=3 \
  --resolver-name="$RESOLVER_NAME" \
  --resolvers-list=/system/etc/dnscrypt-proxy/dnscrypt-resolvers.csv && \
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1 && \
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1
たぶん/systemの更新に失敗してるのでLD_LIBRARY_PATHとPATHの問題でうまく起動しない。 なので素朴な書き方に変更。

99dnscrypt_start.sh

#!/system/bin/sh

DIR=/data/local/dnscrypt
RESOLVER_NAME=dnscrypt.org-fr

LD_LIBRARY_PATH=$DIR
export LD_LIBRARY_PATH

$DIR/dnscrypt-proxy -V

IPTABLES=/data/data/dev.ukanth.ufirewall/app_bin

$DIR/dnscrypt-proxy \
  --resolver-name="$RESOLVER_NAME" \
  --resolvers-list=$DIR/dnscrypt-resolvers.csv \
  --test=3600

echo ""
#exit 0

$DIR/dnscrypt-proxy \
  --daemonize \
  --loglevel=3 \
  --resolver-name="$RESOLVER_NAME" \
  --resolvers-list=$DIR/dnscrypt-resolvers.csv

echo ""
ps|grep dnscrypt-proxy
echo ""
#exit 0

${IPTABLES}/iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1
${IPTABLES}/iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1
google.comを名前解決して確認。
# nslookup google.com
Server:    202.232.2.2
Address 1: 202.232.2.2 ns2.iij4u.or.jp

Name:      google.com
Address 1: 2404:6800:4004:816::200e nrt12s11-in-x0e.1e100.net
Address 2: 216.58.200.174 nrt12s11-in-f14.1e100.net
#
これはdnscrypt-proxy起動前。
# sh 99dnscrypt_start.sh
dnscrypt-proxy 1.6.0
[INFO] + DNS Security Extensions are supported
[INFO] + Namecoin domains can be resolved
[INFO] + Provider supposedly doesn't keep logs
[NOTICE] Starting dnscrypt-proxy 1.6.0
[INFO] Generating a new session key pair
[INFO] Done
[INFO] Server certificate #1466022756 received
[INFO] This certificate looks valid
[WARNING] The certificate is not valid for the given safety margin

root      12878 1     4256   896   ffffffff f7658f65 S /data/local/dnscrypt/dnscrypt-proxy
# nslookup google.com ←確認してみる。
Server:    202.232.2.2
Address 1: 202.232.2.2 ns2.iij4u.or.jp

Name:      google.com
Address 1: 2404:6800:4003:c00::8b sa-in-x8b.1e100.net
Address 2: 74.125.200.113 sa-in-f113.1e100.net
Address 3: 74.125.200.138 sa-in-f138.1e100.net
Address 4: 74.125.200.102 sa-in-f102.1e100.net
Address 5: 74.125.200.139 sa-in-f139.1e100.net
Address 6: 74.125.200.100 sa-in-f100.1e100.net
Address 7: 74.125.200.101 sa-in-f101.1e100.net
#
これはdnscrypt-proxy起動とiptablesによる53番ポートのNAT変換を設定後。 nslookup google.comとかやると、フランスと日本では返すアドレスが違うw

dnscrypt-proxyのkillとiptablesのリセット。
99dnscrypt_stop.sh

#!/system/bin/sh

killall dnscrypt-proxy

IPTABLES=/data/data/dev.ukanth.ufirewall/app_bin

#${IPTABLES}/iptables -P INPUT ACCEPT
#${IPTABLES}/iptables -P FORWARD ACCEPT
#${IPTABLES}/iptables -P OUTPUT ACCEPT
#${IPTABLES}/iptables -F
#${IPTABLES}/iptables -X
${IPTABLES}/iptables -t nat -F
#${IPTABLES}/iptables -t nat -X
${IPTABLES}/iptables -L -n
AFwall+の設定したルールを壊さないよーに
iptables -t nat -F
でnatテーブルだけフラッシュ(-F)
なにかおかしくなったら、AFwall+の再設定(Apply)で回復できる。

なかんじでLinuixとWindows、Androidでdnscrypt-proxyを使う環境を構築して評価開始。

Android: How to create a homescreen shortcut to launch a shell script? [closed]

Androidのホーム画面にシェルスクリプトへのショートカットを張りつけるのは諦めたw
ConnectBotのローカル(Local)シェルでやるのがいちばん簡単かも。

「Local」を長押し、接続ホストの編集、ログイン後の自動実行
. /data/data/org.connectbot/bashrc[改行]
先頭に「. 」(ピリオドと半角ブランク)最後に改行を入れるのが味噌。

/data/data/org.connectbot/bashrc

#!/system/xbin/sh

date
echo "add alias..."
alias 9s='su - -c /data/local/bin/99dnscrypt_status.sh'

これおもろいですな。 TorはDNS参照を追跡されてしまうのが問題だったのだけど DNSCryptと組み合わせることでより高度な匿名化が可能になる。

なんだそれ。参院選終わったのか。

ぐはは。NTT東の無料のダイナミックDNS w
DNSCryptなんて登場してしまうと、自前の無料DDNSサービスでターゲットを引っかけるしかなくなったってかw

オープンソースのデータ収集基盤ソフトウエアの活用を推進し、Hadoopソリューションを拡充
この分散バッチ環境をいったい何に使うのかと思ってたのだけど、DNS参照データの集計と分析だよな。

iplogがうるさいのでiplog用のignoreルールをdnscrypt-resolvers.csvから生成。

0_dnsc_download_resolvers.sh

#!/bin/sh

cd /somewhere

#NO_PROXY=localhost,127.0.0.0/8,::1
#HTTPS_PROXY=http://localhost:8118/
#HTTP_PROXY=http://localhost:8118/

F=dnscrypt-resolvers.new
rm -f ${F}
wget https://raw.githubusercontent.com/jedisct1/dnscrypt-proxy/master/dnscrypt-resolvers.csv -O ${F}||exit 3

dos2unix ${F}

mkdir -p last
B=`date +'%Y%m%d%H%M%S'`
mv dnscrypt-resolvers.csv ./last/dnscrypt-resolvers.csv.$B
mv ${F} dnscrypt-resolvers.csv
#cp dnscrypt-resolvers.csv ..
chmod 644 dnscrypt-resolvers.csv

#./1_dnsc_kick_to_check.sh

1_dnsc_kick_to_check.sh

#!/bin/sh

export LANG=en_US.UTF-8

D=/somewhere
cd ${D}

DAY=`date +'%d'`

P=35353

cp /dev/null dnscrypt_proxy_servers.conf

killall dnscrypt-proxy

#grep -v "^Name" dnscrypt-resolvers.csv|grep -v ipv6|awk -F, '{print $1}'|while read RESOLVER
grep -v "^Name" dnscrypt-resolvers.csv|grep -v ipv6|grep -v ":443"|perl -MList::Util -e 'print List::Util::shuffle <>'|awk -F, '{print $1}'|while read RESOLVER
do
        #echo "RESOLVER ${RESOLVER} ..."
        CMD=`echo /usr/local/sbin/dnscrypt-proxy --ephemeral-keys --resolver-name=${RESOLVER} --resolvers-list=${D}/dnscrypt-resolvers.csv --daemonize --local-address=127.0.0.1:${P}`
        echo ${CMD}
        ${CMD}
        echo "server=127.0.0.1#${P}" >>dnscrypt_proxy_servers.conf
        P=`expr ${P} + 1`
done

#cp dnscrypt_proxy_servers.conf /etc/dnsmasq.d/.
#systemctl restart dnsmasq

2_dnsc_check.exp

#!/usr/bin/expect -f
set host [lrange $argv 0 0]
set server [lrange $argv 1 1]
set port [lrange $argv 2 2]
log_user 0
spawn nslookup
expect "> "
send "server $server\r"
expect "> "
send "set port=$port\r"
expect "> "
send "set timeout=3\r"
expect "> "
log_user 1
send "$host\r"
expect "> "
log_user 0
send "exit\r"
expect eof exit 0
# EOF

2_dnsc_check.sh

#!/bin/sh

cd /somewhere

cp /dev/null 2_dnsc_servers.conf.ok
cp /dev/null 2_dnsc_servers.conf.ng

cp /dev/null 2_dnsc_ok_resolvers.txt

while read LINE
do
    #echo $LINE
    SERVER=`echo $LINE|awk -F= '{print $2}'|awk -F# '{print $1}'`
    PORT=`echo $LINE|awk -F# '{print $2}'`
    echo "SERVER $SERVER PORT $PORT"
    ./2_dnsc_check.exp google.com 127.0.0.1 $PORT|grep -v "127.0.0.1"|grep "Address:"
    if [ "$?" = 0 ]; then
        echo $LINE >> 2_dnsc_servers.conf.ok
                R_OK=`LANG=C ps auxww|grep -v grep|grep $PORT|awk -F "resolver-name=" '{print $2}'|awk '{print $1}'`
                echo "${PORT} ${R_OK}" >> 2_dnsc_ok_resolvers.txt
    else
        echo $LINE >> 2_dnsc_servers.conf.ng
    fi
done < dnscrypt_proxy_servers.conf

# End of FILE.

3_dnsc_kick_ok.sh

#!/bin/sh

export LANG=en_US.UTF-8

D=/somewhere
cd ${D}

DAY=`date +'%d'`

killall dnscrypt-proxy
while read LINE
do
        PORT=`echo $LINE|awk '{print $1}'`
        RESOLVER=`echo $LINE|awk '{print $2}'`
    CMD=`echo /usr/local/sbin/dnscrypt-proxy --ephemeral-keys --resolver-name=${RESOLVER} --resolvers-list=${D}/dnscrypt-resolvers.csv --daemonize --local-address=127.0.0.1:${PORT}`
    echo ${CMD}
    ${CMD}
done < 2_dnsc_ok_resolvers.txt
#systemctl restart dnsmasq

4_dnsc_check_ok.sh

#!/bin/sh

cd /somewhere

while read LINE
do
        PORT=`echo $LINE|awk '{print $1}'`
        RESOLVER=`echo $LINE|awk '{print $2}'`
        ./2_dnsc_check.exp google.com 127.0.0.1 $PORT|grep -v "127.0.0.1"|grep "Address:" >/dev/null
        if [ "$?" = 0 ]; then
                #echo "o $LINE"
                :
        else
                echo "SERVER $SERVER PORT $PORT"
                echo "x $LINE"
        fi
done < 2_dnsc_ok_resolvers.txt

# End of FILE.

5_dnsc_deploy.sh

#!/bin/sh

cd /somewhere
cp 2_dnsc_servers.conf.ok /etc/dnsmasq.d/dnscrypt_proxy_servers.conf
systemctl restart dnsmasq
sleep 1
tail -100 /var/log/messages

5_dnsc_iplog_rule.pl

#!/usr/bin/perl

use strict;
use Text::CSV;

my $pp = Text::CSV->new({ allow_whitespace => 1, binary => 1 });

while(<>) {
        next if (/Name/i);
        next if (/ipv6/i);
    chomp;
    my $line = $_;
    $pp->parse($line);
    my @fs = $pp->fields($line);
        my @items = split(/:/, $fs[10]);
        my $port = $items[1];
        $port = 443 if ($port eq "");
        print "ignore udp sport $port from ".$items[0]."/32 # dnscrypt resolver $fs[0]\n";
}

5_dnsc_iplog_rule.sh

#!/bin/sh

cd /somewhere
cp /etc/iplog.conf.base iplog.conf
echo "">>iplog.conf
perl 5_dnsc_iplog_rule.pl dnscrypt-resolvers.csv >>iplog.conf

8_dnsc_deploy.sh

#!/bin/sh

cd /somewhere

cp iplog.conf /etc/iplog.conf
systemctl restart iplog

cp 2_dnsc_servers.conf.ok /etc/dnsmasq.d/dnscrypt_proxy_servers.conf
systemctl restart dnsmasq
sleep 1
tail -100 /var/log/messages

9_dnsc_driver.sh

#!/bin/sh

cd /somewhere
export PATH=.:$PATH
0_dnsc_download_resolvers.sh
1_dnsc_kick_to_check.sh
2_dnsc_check.sh
3_dnsc_kick_ok.sh
4_dnsc_check_ok.sh
5_dnsc_iplog_rule.sh
8_dnsc_deploy.sh

野田聖子がGJはじめたみたいだな。

DNSスプーフィングの代表的な使い方てたぶん永田偽メール事件だなw。

投稿されたコメント:

コメント
コメントは無効になっています。