網頁

2014年9月9日 星期二

有關FTP自動開port (hole punching)

問題:

Nessus偵測到的FTP server風險。
在同一個區網內的device皆可以借由ftp偷取ftp server上的資訊。

主要原因是因為FTP的protocol在加上router自動hole punching所造成的安全性風險。

環境:

A: ftp client (192.168.1.100)
A1: another ftp client (192.168.1.101)
B: ftp client's router
C: ftp server with public ip

流程:

A ---> B ---> C  (A送出ftp command: PORT ip:port)
C就會replay

在過程中B會因為看到 dst的 port為21 port,因此會偷改 PORT ip:port 為 PORT external_ip:random_port

因此在ftp server端是分辨不出來是否為同一個來源,只知道是在B之下的一個client。

因此 A1利用wireshark或是其他的軟體可以偽造一個 PORT 192.168.1.101:port的封包給 C,C分辨不出來,就會回資訊給B,B會忠實的再回給A1。A1就可以拿到別人的資料。

如何避免這個風險 ?
方法一: ftp server不要用21 port。但此時ftp client端的router要自己手動設portforwarding。
方法二: 使用安全的 tls + ftp 或 ftps,但perforamance會掉很多。

Reference:

https://wiki.filezilla-project.org/Network_Configuration#Malicious_routers.2C_firewalls_and_data_sabotage
http://tools.ietf.org/html/rfc2663
http://www.practicallynetworked.com/support/linksys_ftp_port.htm

2014年9月4日 星期四

[DNS] dynamic update

Dynamic update

環境:

開發機 (A)
裝DNS bind9的機器 (B)

在Zone data加入 allow-update 如下 (on B)

zone "test.com" {                      
        type master;                  
        file "/etc/zone/master/test.com";
        allow-transfer {any;};        
        allow-query {any;};            
        allow-update {any;};      <--- 以上三個設置都非常危險,這邊只是為了做實驗方便
};                                    

把rndc.key 從B copy到A (on B)

把record add到DNS Server (on A)

nsupdate -k rndc.key
> prereq yxdomain test.com
> update add trr123.test.com
> update add try123.test.com 300 A 192.253.253.16
> send

NOTE: 如果成功,可以看到 test.com.jnl會被產生出來

把.jnl file sync到zone file裡面 (on B)

針對test.com會自動sync並且砍.jnl file:
./rndc -k ../named/rndc.key sync -clean test.com也可以對全部的domain sync並砍掉所有的.jnl file
./rndc -k ../named/rndc.key sync -clean

NOTE: 這動作要定期做,以免.jnl的大小成長到超過2G。在很多平台上處理超過2G的file都會出問題。

參考資料:

http://docstore.mik.ua/orelly/networking_2ndEd/dns/ch10_02.htm
https://www.centos.bz/2012/05/bind-nsupdate-dynamic-dns-update-tool/
http://dns-learning.twnic.net.tw/bind/security.html
http://www.zytrax.com/books/dns/ch7/xfer.html#max-journal-size
ftp://ftp.isc.org/isc/bind/9.8.0-P4/doc/arm/Bv9ARM.ch04.html
http://serverfault.com/questions/560326/ddns-bind-and-leftover-jnl-files (最後一個post)

2014年9月2日 星期二

[login system] 如何實作 login system ?

環境:

A: Server (192.168.0.101) + Apache2 Server
B: Client (192.168.0.101) + browser

概念流程:

Cookie sid尚未存在於browser的情況 -

A  <--------------------------------------------- GET index.cgi -----------------------------------------  B
A  ---------------------------------------------- output login.html --------------------------------------> B
A  <------------------------------ POST username/passowrd  to login.cgi (js) -----------------------  B
A  -----after login.cgi response: write sid into cookie and then redirect to index.cgi (js)--------> B


Cookie sid存在browser的情況 -

A  <--------------------------------------------- GET index.cgi -----------------------------------------  B
A  ---------------------------------------------- output login.html --------------------------------------> B

index.cgi

if (COOKIE's sid in connected sessions) {
    output operation.html
} else {
    output login.html
}

login.cgi

if (username and password in db) {
    reponse sid for write cookie
} else {
    // do nothing
}

安全性考量:

1. user輸入的username和password都需要在client js端加密
2. 存下來的user/password一定要是加密後的結果

References:

一篇好文章,有關password加密入門基礎觀念
http://www.jasypt.org/howtoencryptuserpasswords.html

CGI programming
http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm

Http Cookie
http://en.wikipedia.org/wiki/HTTP_cookie

有關C/C++ key generate sample code(public key/private key)
https://shanetully.com/2012/04/simple-public-key-encryption-with-rsa-and-openssl/

有關javascript encrypt
https://code.google.com/p/crypto-js/#SHA-1