Курсов проект № 1 по “Интернет програмиране с Java”

1.8. Multithreaded Port-scan Server

Автор: Красимир Семерджиев

www.nakov.com/inetjava

Версия: 0.9

Последна промяна: 21.03.2004

Сканирането на TCP портовете на дадена машина е процес, който има за цел да установи на кои портове слуша някакъв сървър и на кои не, т.е. кои TCP портове са отворени. Обикновено сканирането на портовете става с програма за сканиране (port scanner), която изпраща последователно или едновременно множество заявки за връзка с машината за сканиране и проверява за всяка от тях дали е успешна. Да се напише програма на Java, която използвайки възможностите на пакета java.net реализира прост сървър за сканиране на мрежи, който работи изцяло по протокол TCP. Потребителите ще достъпват сървъра единствено посредством стандартен telnet, въвеждайки само потребителско име.

Сървърът

Сървърът трябва да дава възможност на потребителя да:

·        се свърже със сървъра посредством стандартен telnet клиент на порт 1234,

·        се идентифицира посредством потребителско име (максимум 8 символа) и без парола,

·        дефинира област за сканиране (начален-краен адрес или маска – 192.168.0.*),

·        дефинира списък/множество (1,2,3,4 или 1-10) от портове за сканиране,

·        зададе отместване във времето за започване на сканирането (примерно след 10 минути),

·        зададе няколко последователни сканирания в произволна последователност и отместване във времето, включително и застъпващи се по време,

·        има възможност да провери текущия статус на всички зададени от него сканирания (PENDING/RUNNING/COMPLETED),

·        прекрати изпълняващо се в момента сканиране,

·        получи резултатите от вече приключило сканиране.

Трябва да се поддържа едновременна работа на повече от един клиент. При стартиране на сървъра той приема като параметър броя нишки, определени за сканиране на портове. Примерно:

STARTSCANNER.BAT 50

Сървърът трябва да реагира на следните команди:

LOGIN <username> – идентифицира конкретен потребител, свързал се със сървъра. При опит за изпълнение на друга команда, преди LOGIN – трябва да се извежда съобщение за грешка „User not identified! Please perform LOGIN!”. Не се позволява едновременната работа на един и същи потребител през няколко telnet сесии. Форматът на изхода от командата LOGIN трябва да е оформен по следния начин:

клиент:

LOGIN gosho

сървър:

Hello [gosho]. You have 3 scans scheduled. Please use LIST to see the current status.

BYE – сървърът изпраща прощален поздрав и затваря връзката.

клиент:

BYE

сървър:

Bye, gosho.

сървър:

(server closes connection)

SCAN <ip range> <ports range> <delay> – задава област за сканиране. Първият параметър определя областта от IP адреси, която ще се сканира, вторият определя множеството от портове, които ще се сканират – ако се изреждат – разделени със запетая, а третият – след колко време да се стартира сканирането. Всички сканирания трябва имат еднакъв приоритет и да се изпълняват паралелно. При стартирането си всяка заявка за сканиране получава номер от 0-99. Позволено е няколко различни потребители да имат дефинирани сканирания с едно и също ID (виж LIST).

клиент:

SCAN 10.18.10.0-10.19.10.0 80,8080,1080,20-25 5

сървър:

User [gosho] has scheduled a scan for ip-range [10.18.10.0-10.19.10.0] for port(s) [80,8080,1080,20-25] to start after [5] minutes.

Сканирането на посочените хостове и портове в този случай трябва да започне след 5 минути.

Друг пример за задаване на сканиране е:

клиент:

SCAN 10.18.10.* 1080 0

сървър:

User [gosho] has scheduled a scan for ip-range [10.18.10.*] for port(s) [1080] to start after [0] minutes.

Сканирането на посочените IP адреси на порт 1080 в този случай трябва да започне веднага.

Трети пример за задаване на сканиране е:

клиент:

SCAN 10.18.*.* 1-25000 0

сървър:

User [gosho] has scheduled a scan for ip-range [10.18.*.*] for port(s) [1-25000] to start after [0] minutes.

Сканирането на IP адресите в този случай трябва да започне веднага.

LIST – извежда списък на всички сканирания, дефинирани от текущия потребител.

клиент:

LIST

сървър:

Defined scans for user [gosho].

| ID | Status:   | IP Range:                       | Ports:

|----|-----------|---------------------------------|-------------------

|  0 | PENDING   | 10.18.10.0-10.19.10.0           | 80,8080,1080,20-25

|  1 | RUNNING   | 10.18.10.*                      | 1080

|  2 | COMPLETED | 10.18.*.*                       | 1-25000

|----|-----------|---------------------------------|-------------------

REMOVE <id> – премахва сканиране от списъка на всички сканирания, дефинирани от текущия потребител.

клиент:

REMOVE 1

сървър:

Scan [1] removed successfully.

клиент:

LIST

сървър:

Defined scans for user [gosho].

| ID | Status:   | IP Range:                       | Ports:

|----|-----------|---------------------------------|-------------------

|  0 | PENDING   | 10.18.10.0-10.19.10.0           | 80,8080,1080,20-25

|  2 | COMPLETED | 10.18.*.*                       | 1-25000

|----|-----------|---------------------------------|-------------------

клиент:

REMOVE 13

сървър:

Scan [13] not defined by user [gosho].

Ако съответното сканиране още не е приключило – то се прекратява и се премахва от списъка. Ако е приключило или не е стартирано, също се премахва от списъка. При липса на сканиране с такова ID – се извежда съобщение за грешка.

RESULT <id> – извежда резултата от дадено сканиране.

клиент:

LIST

сървър:

Defined scans for user [gosho].

| ID | Status:   | IP Range:                       | Ports:

|----|-----------|---------------------------------|-------------------

|  0 | PENDING   | 10.18.10.0-10.19.10.0           | 80,8080,1080,20-25

|  2 | COMPLETED | 10.18.*.*                       | 1-25000

|----|-----------|---------------------------------|-------------------

клиент:

RESULT 2

сървър:

Results for scan of [10.18.*.*] for ports [1-25000]:

        IP: 10.18.0.1

Open ports: 21,23,25,1080,3128,8080

 

        IP: 10.18.0.2

Open ports: 21,23,25,1080,3128

 

        IP: 10.18.250.14

Open ports: 23

 

Scan duration: 10 seconds

След извеждане на резултатите за дадено сканиране – то продължава да стои в списъка, извеждан от команда LIST. За да се махне – трябва експлицитно да се извика команда REMOVE. За всеки адрес се извеждат отворените му портове в нарастващ ред. Адресите, за които не е намерен нито един отворен порт, измежду зададените за проверяване, не се извеждат въобще. Продължителността на едно сканиране се измерва в секунди от момента на стартирането му до момента когато и последният IP адрес е проверен.

За самия процес на сканиране трябва да се използват не повече от предварително зададен максимален брой нишки, независимо колко сканирания се извършват едновременно в момента.