Simpler Portscanner | Angriffsignaturen und Traffic - Lets make differents

Hi Leute,

über dieses Script bin gestern gestolpert. Und möchte es mit euch teilen, da ich denke, dass es, so simpel das Programm auch ist, gerade deswegen, nützlicher ist, als der Autor vielleicht dachte. Um gleich zum Thema zu kommen um was es mir eigentlich geht ein Zitat von bitmuncher zur Einleitung:


"Was wir viel eher brauchen sind Taktiken, die die Signaturen verschleiern. Und dabei müssen wir uns auf den verursachten Traffic konzentrieren, denn das ist es, was das Ziel für die Analyse und Identifizierung des Angriffs zur Verfügung hat. Im weiteren Verlauf dann evtl. auch eingeschleuste Programme, Shellcodes usw, aber erstmal konzentrieren wir uns auf den Traffic, weil es dort am schwierigsten ist." (Low Profile Hacking - Bitmunchers TechBlog)

Traffic ist das Stichwort. Ich beschäftige mich schon länger mit diesem Thema und war begeistert als ich gestern zum ersten Mal den oben verlinkten Beitrag von bitmuncher gelesen habe. Das war der beste deutschsprachige Artikel den ich zu diesem Thema gelesen habe. Big up an dieser Stelle nochmal an bitmuncher. Auch Robert David Graham und sein Team, die Entwickler von masscan, haben sich über das Thema Traffic Gedanken gemacht. Bei dem Programm, dass Sie entwickelt haben, war das auch unumgänglich. (https://www.youtube.com/watch?v=nX9JXI4l3-E) An dieser Stelle möchte ich ausdrücklich darauf hinweisen, dass bevor jetzt die ersten Übermotivierten anfangen wie wild geworden das komplette 0.0.0.0/8 abzuscannen, dass das bereits getan wird und sie sich die Mühe sparen können (zumindestens einen betrachtlichen Teil..). Die University of Michigan hat dazu ein Projekt ins Leben gerufen: https://scans.io/ Das sollte vorerst Viele davon abhalten unnötig Traffic zu erzeugen (und im schlimmsten Fall Ärger mit seinem ISP zu bekommen. Wie schnell das geht erwähnt das Team von masscan in ihrer Presentation).

Alles wesentliche zum Thema Traffic und Angriffsignaturen im www zu hinterlassen ist im entsprechenden Artikel von Bitmuncher erklärt, also spare ich mir dazu weitere Worte. Lest selbst.

Jetzt zu dem Portscanner Script. Der erzeugte Traffic scheint unauffälliger, als der von Nmap. An der Stelle sei auf das sehr schöne Projekt Portspoof - About hingewiesen (was Portspoof alles kann wurde in einem sehr empfehlenswerten Artikel in der Zeitschrift linuxuser spezial 01/2014 September - November erläutert.) Gegen Nmap ist also schon einiges digitales Kraut gewachsen. Zeit für neue Methoden. Womit wir dann doch endlich beim Script wären. Das Script ist wie ihr sehen könnt in Python geschrieben und ich hoffe, dass jetzt nicht die meisten von euch die Arme verzweifelt über den Kopf zusammenschlagen. Ich verstehe von Python ehrlich gesagt nicht wirklich viel, daher bin auf eure Hilfe angewiesen (und, dass das sehr gut funktioniert habt ihr hier https://www.hackerboard.de/code-kitchen/49729-hilfe-bei-shellscript-findet-den-fehler-bitte.html bewiesen :)

Wie ihr seht macht das Script nichts anderes als mit Syn (ist das richtig?) abfragen die Ports abzuklopfen, ob sie offen sind oder nicht. Es gibt auch ein Nmapmodul für Python was mittels ACK die Ports abklopft, das dauert allerding unnötig lange und hat bei mir nicht funktioniert, also lassen wir das Nmapmodul (erstmal) außen vor (http://www.youtube.com/watch?v=7SrN4OPg_pM). Es reicht für einen ersten Überblick eines Netzwerkes auch erstmal vollkommen aus zu wissen ob und welche Ports offen sind. Jeder (der sich mit der Materie auskennt) weiß, dass (höchstwahrscheinlich) auf Port 21 FTP, auf Port 22 SSH, auf Port 23 Telnet und so weiter warten. Und wir sprechen eh erstmal nur von den öffentlichen Ports. Was auf den privaten Ports (49151-60000) alles läuft sei erstmal dahingestellt, denn wie gesagt auch Nmap wird das nicht immer herrausfinden. Warum die Pferde schon im Vorraus unnötig scheu machen und Gefahr laufen, dass entsprechende Gegenmaßnahmen getroffen werden?

Das Script ist allerding noch recht umständlich. Man muss jeden einzelnen Port per Hand eingeben und es lässt sich immer nur ein Host auf einmal abscannen. Ein bisschen Automatisierung wäre schon angebracht. Ich denke da an eine Top Ports Option und vielleicht einen verbose mode/debug mode(wenn das geht?) um auch sehen zu können was genau passiert. Nützlich wäre auch zwischen unterschiedlichen Scanmethoden SYN/Connect/ACK/Window/Maimon wechseln zu können, sowie eine packet fragmentation Funktion (die bei mir in 4 Jahren Nmap Erfahrung bisher noch nie andere Ergebnisse erzielt hat als die unfragmentierten Scans). Und da kommt ihr ins Spiel.

Allen Skeptikern und Unüberzeugten die jetzt argumentieren werden, dass es das doch alles schon gibt (Nmap, masscan, Zmap, usw.) sei gesagt: Ihr habt vollkommen recht! Und genau da liegt das Problem. Die einschlägigen Programme und somit auch die entsprechenden Angriffsignaturen sind bereits bekannt. Jeder Systemadministrator der sich mit IDS auskennt könnte bei diesen Scans wutschnaubend Gegenmaßnahmen ergreifen. Und wenn dann Portspoof zum Einsatz kommt, kann das durchaus böse enden (wer es jetzt noch nicht weiß: man kann mit Portspoof, wenn man abgescannt wird gleich mit entsprechenden Exploits antworten...).


Code:
#Basic Port Scanner
#by Draps Tv (https://www.youtube.com/watch?v=IOvvjNi8OdU)


import optparse
from socket import *
from threading import *
import os


os.system('clear')
print "--------------------------------------------------------------------------------------------"
print
print "Simple Portscanner based on script by Draps Tv" 
print "Take a look: https://www.youtube.com/watch?v=IOvvjNi8OdU"
print
print "Just simple but faster then Nmap"
print 
print
print
print "--------------------------------------------------------------------------------------------"
print


screenLock = Semaphore(value=1)

def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket(AF_INET, SOCK_STREAM)
        connSkt.connect((tgtHost, tgtPort))
        connSkt.send('hello\r\n')
        
        results = connSkt.recv(100)
        screenLock.acquire()
        print "[+] " + str(tgtPort) + "/tcp open"
    except:
        screenLock.acquire()
        print "[-] " + str(tgtPort) + "/tcp closed"
    finally:
        screenLock.release()
        connSkt.close()

def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except:
        print "[-] Cannot resolve " + tgtHost + ": Unknown host"
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print "\n[+] Scan Results for: " + tgtName[0]
    except:
        print "\n[+] Scan results for: " + tgtIP
    
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
        t.start()

def Main():
    parser = optparse.OptionParser('usage %prog '+\
        '-H <target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string', \
        help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', \
        help='specify target port[s] seperated by comma')
    (options, args) = parser.parse_args()
    if (options.tgtHost == None) | (options.tgtPort == None):
        print parser.usage
        exit(0)
    else:
        tgtHost = options.tgtHost
        tgtPorts = str(options.tgtPort).split(',')

    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    Main()
Ich bin sehr gespannt was sich daraus entwickelt...
 
Zuletzt bearbeitet:
Nmap failt über Proxy (was den meisten hier hoffentlich bekannt sein sollte) und ist weitaus langsamer als der simple Portscanner. Dazu ist der erzeugte Traffic unauffälliger, als der von Nmap.

Bullshit...mehr fällt mir zu dem ganzen irgendwie nicht ein.

Btw.:
Code:
mime@kira[5]:~/ (0)$ /opt/nmap/bin/nmap --help
  --proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies
mein ja nur...
 
Jup stimmt.. da ich meinen gesamten Traffic über tor laufen lasse, habe ich die Proxyfunktion von Nmap tatsächlich ignoriert. Somit sind die Zeiten doch nicht allzu verschieden. Habe es getestet und du hast Recht. Es bleibt trotzdem das Problem das Nmap eben eine bestimmte Vorgehensweise hat die IDS schon kennen. Es muss doch Möglichkeiten geben diese Methoden zu ändern, neue Wege zu gehen. Der Thread ist als konstruktiver Vorschlag zu verstehen, neue flexibele Mehoden zu entwickeln um eben im Trafficdschungel die verschidenen Angriffzenarien nicht immer gleich eindeutig identifizierbar zu machen - nicht gleich aufzufallen. Es ist erstmal nur ein Vorschlag. Habe den Beitrag dementsprechend geändert. Danke nochmal für den Hinweis.
 
Zuletzt bearbeitet:
Der einfachste Weg dafür zu sorgen, dass nmap nicht mehr als nmap erkannt wird, ist die Aufteilung der Scans in zufällige Port-Blöcke. Man lässt dazu mehrere Instanzen von nmap parallel laufen, wobei mittels Skript entschieden wird welche Ports jede Instanz abscannt. Dadurch erhält man recht einfach ein halbwegs zufälliges Scan-Muster. Dazu braucht man also keinen eigenen Scanner.

Als Proxy kann man ein eigenes Skript/Tool einsetzen, das das Timing der Pakete normalisiert, indem es sie künstlich ausbremst, so dass der Datenstrom aller parallel laufenden Instanzen zusammen immer gleichmässig ist. Ausserdem hat man über ein solches Tool die Möglichkeit bei Bedarf ein paar optionale Paket-Header einzustreuen, um auch in diesem Bereich etwas für Verwirrung zu sorgen.

Daher würde ich weniger an einem Scanner arbeiten als eher an einem Proxy-Tool, das Angriffssignaturen verschleiert. Ausserdem würde ich sowas nicht in der Öffentlichkeit des WWW tun. Wenn nur du deine Tools kennst, kann man sie nicht so einfach auf dich zurückführen. Vorausgesetzt natürlich, du nutzt sie nicht von deinem eigenen Internet-Anschluss aus. ;)
 
Wie ihr seht macht das Script nichts anderes als mit Syn (ist das richtig?) abfragen die Ports abzuklopfen, ob sie offen sind oder nicht.

Das Skript baut eine komplette TCP-Verbindung auf, schickt ein "hallo\r\n" durch diese Leitung und schliesst sie am Ende wieder. Komplett bedeutet: Syn hin, Ack zurück, Syn/Ack hin, dann die Daten, dann Fin hin, Ack zurück, Fin/Ack hin. Das kann auch nmap mit dem Parameter -sT. In der hervorragenden man-Page von nmap steht sogar, warum dieser Typ von Scan eher ungeeignet ist, wenn man unerkannt bleiben möchte. Tipp: Anschauen.

(und vor allem sollte man Abstand davon nehmen, unnötigen Stuss wie "hallo\r\n" zu senden, was in jedem anständig konfigurierten SIEM sofort zur Erkennung einer Ungereimtheit führen wird. Der Sinn dahinter ist ebenfalls fragwürdig - z.B. würde das bei HTTP nicht mal eine Fehlermeldung provozieren... Man merkt daher, dass dieses Skript Datenmüll ist, den es dank YT heute leider zu Genüge gibt)

Es gibt auch ein Nmapmodul für Python was mittels ACK die Ports abklopft, das dauert allerding unnötig lange und hat bei mir nicht funktioniert

Ein Ack-Scan (nmap -sA) ist etwas gänzlich anderes und erstmal nicht zum reinen Portscanning geeignet. Auch hier empfiehlt sich ein Studium der oben verlinkten, großartigen man-Page von nmap.

Es bleibt trotzdem das Problem das Nmap eben eine bestimmte Vorgehensweise hat die IDS schon kennen.

Im Prinzip gibt es nur eine begrenzte Zahl an Möglichkeiten für Scans. Die Kunst für einen Verteidiger ist es daher auch eher, Scans von "legitimen" Requests zu unterscheiden, z.B. über Korrelation. Fakt ist, dass nmap inzwischen in unzähligen Konfigurationen ausführbar ist, um nahezu alle dieser Fälle abzudecken. Sicher, alternative Ansätze gibt es auch - bislang konnte Fyodor allerdings noch auf alle antworten. Das zeigt auch, wie viel Arbeit bislang in nmap gesteckt wurde und wie viel Gedanken man sich dabei gedacht hat.

Darüber hinaus muss man sich klar sein, dass "die IDS" per default meist nur gegen Standardangriffe schützen und komplexe Angriffe, oder längerfristige Angriffe (ein SYN-Paket alle paar Wochen - SIEM Systeme arbeiten üblicherweise dagegen auf Realtime-Daten bzw. auf Daten weniger Stunden/Tage) praktisch garnicht erkennen können. Um ein neues System zu entwickeln ist es daher essentiell zu wissen, wie "die IDS" überhaupt Angriffe erkennen und an welchen Parametern man schrauben müsste. Dann kannst du auch gerne mit einem alternativen Ansatz gegen nmap antreten ;)

Mit masscan hat das Ganze übrigens nichts zu tun, denn masscan ist nicht darauf ausgelegt, die Identität des Angreifers zu verbergen.

Edit:
Und habe ich eigentlich schon erwähnt, dass die oben verlinkte man-Page zum Grundlagenwissen heutiger Netzwerksicherheitsspezialisten gehören sollte?
 
Zuletzt bearbeitet:
Danke erstmal für das schnelle Feedback und der nötigen Aufklärung. Es ist sehr schön zu sehen, wie ihr Illusionen zerstören könnt und gleichzeitig Platz für neue, großartige Ideen schafft. So habe ich mir das auch vorgestellt. :) "und vor allem sollte man Abstand davon nehmen, unnötigen Stuss wie "hallo\r\n" zu senden" Das hätte ich natürlich geändert, wenn sich die Arbeit an dem Projekt gelohnt hätte. "Und habe ich eigentlich schon erwähnt, dass die oben verlinkte man-Page zum Grundlagenwissen heutiger Netzwerksicherheitsspezialisten gehören sollte?" Und auch da hast du Recht. Und ich muss beschämt eingestehen, dass es offenstichtlich viel zu lange her ist, als ich die man page durchgearbeitet habe und es sich immer wieder aufs Neue lohnt einen gründlichen Blick darauf zu werfen. Ihr habt mich überzeugt, dass es nicht wirklich einer Alternative zu Nmap bedarf, wenn man neue Wege gehen lernt mit Nmap zu arbeiten. -> "Darüber hinaus muss man sich klar sein, dass "die IDS" per default meist nur gegen Standardangriffe schützen und komplexe Angriffe, oder längerfristige Angriffe (ein SYN-Paket alle paar Wochen - SIEM Systeme arbeiten üblicherweise dagegen auf Realtime-Daten bzw. auf Daten weniger Stunden/Tage) praktisch garnicht erkennen können." und "Der einfachste Weg dafür zu sorgen, dass nmap nicht mehr als nmap erkannt wird, ist die Aufteilung der Scans in zufällige Port-Blöcke. Man lässt dazu mehrere Instanzen von nmap parallel laufen, wobei mittels Skript entschieden wird welche Ports jede Instanz abscannt. Dadurch erhält man recht einfach ein halbwegs zufälliges Scan-Muster." Und genau das hat mich inspiriert, an dem Projekt "neue Methoden" festzuhalten und daran weiterzuarbeiten. Stichwort: Timing (...) Dazu eventuell mehr in einem neuen Thread.. "Mit masscan hat das Ganze übrigens nichts zu tun, denn masscan ist nicht darauf ausgelegt, die Identität des Angreifers zu verbergen." Natürlich nicht. Das habe ich auch nie behauptet. Danke nochmal für eure Hilfe.
 
Zurück
Oben