顯示具有 Network 標籤的文章。 顯示所有文章
顯示具有 Network 標籤的文章。 顯示所有文章

星期三, 10月 20, 2010

利用ssh在local跑遠端上的GUI軟體

今天看了hak5,才發現原來ssh有這麼好用的參數。

$ssh -v -X name@host
$firefox &

執行完後,就會發現在本機端可以跑起ff來了!

重點是即使沒有安裝,仍然沒問題。

因為其實ff本身還是在ssh主機上面跑的。

當然,附註一下,要在windows下這樣跑也是可以的。

只要安裝xming和下載pietty,

在pietty連線時候enable x11-forwarding即可。

星期二, 10月 12, 2010

Catalyst 2960-G 開機順序

Pre-Work
準備一台PC及網路線。

開始吧。

1.確認所有網路線都已經被拔除
2.在開機期間因為Switch會以DHCP server的方式運作,所以如果原本PC有static IP的話要調整成DHCP。
在此記得先把static IP抄下來,之後可能會用到。
3.插上Switch電源,大約30秒後會開始自我測試。經過五分鐘後,應該只剩SYSTEM LED是亮著穩定的綠燈,其他都要是關的了。(唯一的例外是STACKMASTER LED,如果它也亮著穩定的綠燈,表示switch 正在用stack mode運作,而且本身是stack master。)
4.按下mode鍵,直到所有LED燈穩定亮著綠色為止。(有些swtich可能RPS LED會不亮。)
5.把網路線插上PC及switch的任一port,switch上該port的LED會閃綠燈,表示已經成功連接。
6.打開瀏覽器,在網址列輸入http://10.0.0.1,可以進入設定網頁。(如果沒有Enable javascript的話會無法順利進入。)
7.下列欄位是必要輸入的:
VLAN ID:預設是1,建議在設定期間先不要改,因為設定期間VLAN是唯一的。之後如果要改的話,改的範圍從1~1001皆可。
IP address:就是IP位置。
Subnet Mask:子網路遮罩。
Default Gateway
Switch password:1~25個字元,大小寫有差,除開始結束外其他地方可有空白字元。(原本預設是cisco)
8.按submit後即可完成設定

記得在此之後,就需要改成用剛才設定的IP位置才能http到switch的設定介面。

星期五, 9月 10, 2010

Kismac -- Mac OS X 上的無線探測工具

除了Wireshark以外,MAC上還有這套頗好用的工具。

雖然此工具和Kismet沒有關係,但此工具提供不少不錯的功能:

1. 簡單明瞭的GUI
2. 支援GPS
3. Crack of some protocol
在選單下,收集足夠的packet以後就可以進行crack WEP, LEAP。
4. de-authentication attack
5. 可以在MAC下進行rfmon mode (不用和任何AP associate即可sniffing traffic)

星期日, 3月 14, 2010

Set MAC address of NIC

Linux中使用下列指令可以直接設定MAC Address


#ifconfig [interface_name] hw ether [desired_MAC_Address]


interface_name:是指定哪個網路介面

hw ether:此介面為ethernet

最後就是想要的MAC Address。

有些AP如果是用MAC作為連線阻擋的話,先sniff一陣子,再加上這個還是可以連的上的。

Wireless Crack Tool - aircrack-ng

在Ubuntu中使用Kismap,來找出現在身邊有誰。

接著安裝aircrack-ng系列,用apt會安裝上一系列程式。

使用airmon-ng, airodump-ng


/tmp$ sudo airmon-ng start wlan0 //開始monitor wlan0介面
Interface Chipset Driver

wlan0 Intel 3945ABG iwl3945 - [phy0]
(monitor mode enabled on mon5)
mon0 Intel 3945ABG iwl3945 - [phy0]
mon1 Intel 3945ABG iwl3945 - [phy0]
mon2 Intel 3945ABG iwl3945 - [phy0]
mon3 Intel 3945ABG iwl3945 - [phy0]
mon4 Intel 3945ABG iwl3945 - [phy0]


/tmp$ sudo airodump-ng -i -w ivs mon5 //可以得知會在mon5上, -i表示只抓ivs, -w 是log的prefix
/tmp$ sudo aircrack-ng -a 1 -b 00:16:01:F4:B0:2D ivs-04.ivs //-a 1表示只crack wep, -b是針對bsid, 最後就是目標log檔


如果抓取packet數量夠多的話,就可以破解無線網路了。

星期日, 7月 19, 2009

IMAP in Python - 8 (Reading Flags)

Twisted提供簡單的函式可以直接讀取message flag:


class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory

d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(lambda x: self.proto.examine('INBOX'))
d.addCallback(lambda x: self.proto.fetchFlags('1:*'))
d.addCallback(self.handleflags)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)
d.addErrback(self.errorhappened)
def handleflags(self, flags):
for num, flaglist in flags.items():
print "Message %s has flags %s" % (num, ", ".join(flaglist['FLAGS']))

使用fetcgFlags(range)就可以取得範圍內message的flag。當然Twisted也提供了setFlags()、addFlags()、removeFlags(),都只需要提供一個list of strings,每個string都是一個flag即可。OUTPUT:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tflag.py mx.mgt.ncu.edu.tw cacaegg
Enter password:
Message 1 has flags \Recent
Message 2 has flags \Recent


程式連結

星期六, 7月 18, 2009

IMAP in Python - 7 (Downloading Message Individually)

由於一次全部下載完,信件一多就浪費許多記憶體,因此來分封下載。可以先發出request來查看message number,來看程式碼:

d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(lambda x: self.proto.examine('INBOX'))
d.addCallback(lambda x: self.proto.fetchUID('1:*'))
d.addCallback(self.handleuids)

可以看到選定folder以後,我們呼叫fetchUID來抓取folder所有的UID,但是回傳的結構其實是如此的dictionary[uid -> Dictionary[]]。也就是每封信本身也都是一個dictionary,來看看如何處理:

def handleuids(self, uids):
dlist = []
destfd = open(sys.argv[3], "at")
for data in uids.values():
uid = data['UID']
d = self.proto.fetchSpecific(uid, uid =1, peek = 1)
d.addCallback(self.gotmessage, destfd, uid)
dlist.append(d)
dl = defer.DeferredList(dlist)
dl.addCallback(lambda x, fd: fd.close(), destfd)
return dl

對於每封信的dictionary,我們取用其中的'UID'部份,而fetchSpectific的uid = 1是告訴此函式把第一個參數當UID看而非message number,最後加到deferred list中。deferred list會等到所有deferred結束後,再把結果一次傳給第一個Callback。最後來看gotmessage():

def gotmessage(self, data, destfd, uid):
print "Received message UID", uid
for key, value in data.items():
print "Writing message", key
i = value[0].index('BODY') + 2
msg = email.message_from_string(value[0][i])
destfd.write(msg.as_string(unixfrom = 1))
destfd.write("\n")

與之前不同的是,這次找message body text並不是寫死的固定位置,因為可能會因server不同而回傳資料有所不同,不過相同的是text都是在'body'後面的第二個位置,所以就直接用算的算出來。最後來看程式的output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tdownload.py mx.mgt.ncu.edu.tw cacaegg mailbox
Enter password:
Received message UID 15024
Writing message 1
Received message UID 15025
Writing message 2


程式連結

IMAP in Python - 6 (Downloading an Entire Mailbox)

開始來下載信件囉!最簡單的方式,就是一次全部下載,只是此方式,twisted需要把信件cache在記憶體中,因此對於大信箱來說,此種方式不太可行。

來看看怎麼使用吧:

d = self.proto.login(self.factory.username, self.factory.password)

d.addCallback(lambda x: self.proto.examine('INBOX'))
d.addCallback(lambda x: self.proto.fetchSpecific('1:*', peek = 1))
d.addCallback(self.gotmessages)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)

可以看到使用protocol class的fetchSpecific()就可以抓取信件。而第一個參數'1:*'則表示抓取的範圍是從第1封到最後一封,也就是所有的信件;第二個參數把peek設定為1,是要server不要在我們把信抓下來後就加上/seen已讀的flag(預設是會加的)。
再來就是看看gotmessages如何處理信件:

def gotmessages(self, data):
destfd = open(sys.argv[3], 'at')
for key, value in data.items():
print "Writing message", key
msg = email.message_from_string(value[0][2])
destfd.write(msg.as_string(unixfrom = 1))
destfd.write("\n")
destfd.close()

fetchSpecific傳給data,data會是dictionary。key是message number,而value就是components of the list。我們把value中[0][2]是代表entire message直接寫入目標檔案中,就算完成囉!
來看output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tdlbig.py mx.mgt.ncu.edu.tw cacaegg mailbox
Enter password:
Writing message 1
Writing message 2
Writing message 3

程式連結

IMAP in Python - 5 (Summary Information)

在對folder進行select或examine以後,server會回傳summary information。

來看看如何使用:

class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory
d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(lambda x:self.proto.examine('INBOX'))
d.addCallback(self.examineresult)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)

d.addErrback(self.errorhappened)

def examineresult(self, data):
for key, value in data.items():
if isinstance(value, tuple):
print "%s: %s" % (key, ",".join(value))
else:
print "%s: %s" % (key, value)

在此例中,檢查了INBOX後,把結果傳給了examineresult,examineresult會把結果顯示出來。
程式跑出來的結果如下:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ texamine.py mx.mgt.ncu.edu.tw cacaegg
Enter password:
EXISTS: 0
PERMANENTFLAGS:
READ-WRITE: 0
UIDNEXT: 15020
FLAGS: \Answered,\Flagged,\Deleted,\Seen,\Draft,Junk,NonJunk,$MDNSent,$Forwarded,NotJunk
UIDVALIDITY: 1153809236
RECENT: 0

來解釋一下常用的item
EXISTS:folder中的message數目
FLAGS:可以放在此folder上的flag
RECENT:上次select之後,大約有多少新進的message
UIDVALIDITY:將此id與上次session比較,就可以用做uid驗證,確保uid相同的一樣的message

程式連結

星期五, 7月 17, 2009

IMAP in Python - 4 (Scaning the Folder List)

IMAP支援多個mailbox,也就是多個folder。可以用protocol class中的list(ref, pattern)來取得。來看一下例子:

class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory
d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(lambda x: self.proto.list('', '*'))
d.addCallback(self.listresult)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)
d.addErrback(self.errorhappened)

def listresult(self, data):
print "%-35s %-5s %-37s" % ('Mailbox Name', 'Delim', 'Mailbox Flags')
print '-' * 35, '-' * 5, '-' * 37
for box in data:
flags, delim, name = box
print "%-35s %-5s %-37s" % (name, delim, ','.join(flags))

可以看到呼叫了proto.list()並且傳了兩個參數,第一個是reference,有某些特殊用途,例如要取得Usenet等,大多時候是留白的;第二個參數是folder pattern,也就是要找的folder名字是什麼。在此支援wild card,所以*就表示了所有的folder都要。

來看一下程式輸出:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tlist.py mx.mgt.ncu.edu.tw cacaegg
Enter password:
Mailbox Name Delim Mailbox Flags
----------------------------------- ----- -------------------------------------
virus-mail / \NoInferiors,\UnMarked
spam-mail / \NoInferiors,\UnMarked
mail-trash / \NoInferiors,\UnMarked
Sent Items / \NoInferiors,\UnMarked
Deleted Items / \NoInferiors,\UnMarked
Junk E-mail / \NoInferiors,\UnMarked
Drafts~ / \NoInferiors,\UnMarked
sent-mail-feb-2008 / \NoInferiors,\UnMarked
INBOX / \NoInferiors,\UnMarked

可以看到list()回傳的是"a list of tuples"。而每組tuple都有3個item,分別是folder name、Delimiter以及Flag。在此簡介一下常看到的flag:
\Noinferiors:沒有subfolder也不可能會有subfolder。
\Noselect:不能進行select or examine,也就是folder內沒有訊息。
\unmarked:沒有新訊息(相對的\marked就可能是有,不過要看server怎麼用)。

程式連結

IMAP in Python - 3 (Error Handling)

前面的例子無法處理錯誤出現的情形,如果出現了錯誤,程式就會因為沒有呼叫到reactor.stop()造成程式卡住,再來看看twisted中如何處理錯誤呢?由於錯誤發生的時候,控制權可能已經不是當下那個function的了,所以一樣使用callback,而處理錯誤的callback稱之為errback。

直接來看例子:

class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory
self.logintries = 1

d = self.login()
d.addCallback(self.loggedin)
d.addErrback(self.loginerror)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)

d.addErrback(self.errorhappen)

print "IMAPLogic.__init__returning."

只要對defered object呼叫addErrback,此errback function就會負責處理當時以上的function,也就是說loggedin()發生的錯誤由loginerror()處理,而logout()與stopreactor()的錯誤也由errorhappen()來處理。其實,如果在login()發生了在loginerror()無法處理的錯誤時,twisted會直接把錯誤丟給下一個errback,此例是loginerror()無法處理的錯誤就傳給errorhappen()>
那就再來看一下那兩個errback function:

def loginerror(self, failure):
print "Your loging failed (attemp %d times)." % self.logintries
if self.logintries >= 3:
print "You have tried to log in three times; I'm giving up."
return failure
self.logintries += 1

sys.stdout.write("username:")
self.factory.username = sys.stdin.readline().strip()
self.factory.password = getpass.getpass("password:")

d = self.login()
d.addErrback(self.loginerror)
return d

在這邊處理的是只有登入超過三次失敗的情形,如果超過三次等情形,就會直接return failure把錯誤傳接下去給errorhappen()。在此function的結尾有增加defered object呼叫自己,如果沒成功就繼續回來此function。


def errorhappen(self, failure):
print "An error occurred:", failure.getErrorMessage()
print "Because of the error, I am logging out and stopping reactor..."
d = self.logout()
d.addBoth(self.stopreactor)
return failure

此function是單純把failure的訊息印出來,然後logout(),並且無論logout成功失敗都要呼叫stopreactor()來把reactor.run()中止,避免程式掛著。
以下是程式的兩種output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ t-error.py mx.mgt.ncu.edu.tw cacaegg
Enter password for cacaegg on mx.mgt.ncu.edu.tw:
I have successfully connected to the server!
Logging in...
IMAPLogic.__init__returning.
connectionMade returning
I'm logged in!
Logging out.
Stopping reactor.
cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ t-error.py mx.mgt.ncu.edu.tw cacaegg
Enter password for cacaegg on mx.mgt.ncu.edu.tw:
I have successfully connected to the server!
Logging in...
IMAPLogic.__init__returning.
connectionMade returning
Your loging failed (attemp 1 times).
username:ewfwfewf
password:
Logging in...
Your loging failed (attemp 2 times).
username:efwfew
password:
Logging in...
Your loging failed (attemp 3 times).
You have tried to log in three times; I'm giving up.
An error occurred: Authentication failed.
Because of the error, I am logging out and stopping reactor...
Logging out.
Unhandled error in Deferred:
Traceback (most recent call last):
Failure: twisted.mail.imap4.IMAP4Exception: Authentication failed.
Stopping reactor.


程式連結

IMAP in Python - 2 (Logging In)

再來看如何使用twisted來進行登入,以及defered object的chain callback。

此次分成3個主要的class:Protocol、Factory、Logic。分別來看一下。
Protocol Class:

class IMAPClient(IMAP4Client):
def connectionMade(self):
print "I have successfully connected to the server!"
IMAPLogic(self)
print "connectionMake returning"

主要就是把邏輯部份從原本的protocol中分離出來了,此protocol class現在變成主要就是處理關於協定的callback。


class IMAPFactory(protocol.ClientFactory):
protocol = IMAPClient

def __init__(self, username, password):
self.username = username
self.password = password

def clientConnectionFailed(self, connector, reason):
print "Client connection failed:", reason
reactor.stop()

此class會在__init__時就把帳號密碼存入,以待登入時使用。


class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory

d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(self.loggedin)
d.addCallback(self.stopreactor)

print "IMAPLogic.__init__returning."
def loggedin(self, data):
print "I'm logged in!"
return self.logout()
def logout(self):
print "Logging out."
d = self.proto.logout()
return d
def stopreactor(self, data = None):
print "Stopping reactor."
reactor.stop()

此邏輯class在__init__時,就會先把protocol class & factory變成member。然後呼叫protocol的login(),在此會回傳第1個defered object,對此object設定兩個callback。這樣就成為"Chain callback",對於每個子callback,如果還有其他defered物件,twisted會將其都處理完才會呼叫原parent defered object的下一個子callback,且把最後一次callback的結果當作參數送給下一個。因此在此例子中,執行的順序是loggedin() --> logout() --> proto.logout() --> stopreactor() --> reactor.stop(),如此執行。

以下為程式output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tlogin.py mx.mgt.ncu.edu.tw cacaegg
Enter password for cacaegg on mx.mgt.ncu.edu.tw
I have successfully connected to the server!
IMAPLogic.__init__returning.
connectionMake returning
I'm logged in!
Logging out.
Stopping reactor.


程式連結

星期四, 7月 16, 2009

IMAP in Python - 1 (Understanding Twisted Basics)

Python本身也有imaplib可供操作,不過在此使用一套挺有名的framework--Twisted。

Twisted有一個很大的特色就是以Event-based來進行程式設計,也就是會使用到callback function。

直接用程式碼來簡單介紹如何使用:

#!/usr/bin/env python

from twisted.internet import defer, reactor, protocol
from twisted.mail.imap4 import IMAP4Client
import sys

class IMAPClient(IMAP4Client):
def connectionMade(self):
print "I have successfully connected to the server!"
d = self.getCapabilities()
d.addCallback(self.gotcapabilities)

def gotcapabilities(self, caps):
if caps == None:
print "Server did not return a capability list."
else:
for key, value in caps.items():
print "%s: %s" % (key, str(value))
self.logout()
reactor.stop()
class IMAPFactory(protocol.ClientFactory):
protocol = IMAPClient

def clientConnectionFailed(self, connector, reason):
print "Client connection failed:", reason
reactor.stop()

reactor.connectTCP(sys.argv[1], 143, IMAPFactory())
reactor.run()


分為兩種class:
IMAPClient-作為Protocol class之用途,負責與server的protocol conversation
IMAPFactory-作為Connection class之用途,負責connection的部份

而reactor是Twisted中的Network event handler,在主程式第1行先用reactor.connectTCP進行連線,
成功後會呼叫connectionMade()來進行後續處理。

在connectionMade裏面,呼叫繼承而來的getCapabilities()來取得有關server支援IMAP選項的參數,且會回傳defer物件。要用此物件來告訴reactor等到有事件發生時該呼叫誰,在此使用了d.addCallback告訴reactor等到有事件時,需要呼叫self.gotcapabilities來處理。(注意在此沒有用括號,因為是callback沒有需要立刻呼叫)

接著進行reactor.run(),此function會等到有人呼叫reactor.stop()才會return,否則就不斷等待事件,事件發生了後,就按照預定的呼叫gotcapabilities(),印出有關的參數,然後logout(),最後stop()結束程式。

此程式的output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ sudo ./tconn.py mx.mgt.ncu.edu.tw
I have successfully connected to the server!
SASL-IR: None
SORT: None
THREAD: ['REFERENCES']
STARTTLS: None
UNSELECT: None
NAMESPACE: None
IDLE: None
AUTH: ['PLAIN']
IMAP4rev1: None
LOGIN-REFERRALS: None
MULTIAPPEND: None
LITERAL+: None
CHILDREN: None

星期三, 7月 15, 2009

Introduce IMAP

此篇的目的在簡略列出一些IMAP的特色,比起POP3有哪些優勢

。支援多mail folders,不只單一的user inbox

。可以儲存Flag(例如read、replied、seen、deleted)

。可在server side進行搜尋郵件的動作

。支援server內folder之間信件的複製

。可以新增信件到遠端folder

。message有了unique id

。可選擇郵件的某部份下載就好(例如附件)

。支援不同機器上同一個client的同步(一個帳號可以在不同機器上作業)

最大的好處:same mail in the same state from multiple machines at any time.