Курсов проект № 1 по “Интернет програмиране с Java”
1.8. Multithreaded Port-scan Server
Автор: Красимир Семерджиев
Версия: 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 адрес е проверен.
За самия процес на сканиране трябва да се използват не повече от предварително зададен максимален брой нишки, независимо колко сканирания се извършват едновременно в момента.