Комментарии 23
Спасибо вам!
Спорно. Очень спорно, особенно в случае shared хостинга. Если у меня на сервере 300 сайтов на одном ип — это правило сработает ровно для одного домена. А извне невозможно определить hostname сервера…
за один только заголовок можно автора забанить
Сетевики там где много каналов связи, телефонии, ВКС. Где много L2/L3 VPN в рамках B2B. Когда ты траблшутишь корявую покраску трафика со стороны оператора или почему посреди ВКС кто то начинает роботизированным голосом общаться. Маршрутизация трафика, ограничения на уровне сетевого доступа по портам и протоколам это обыденность в работе сетевика. Принять телефонию от оператора, прогнать через CUCM, выплюнуть в Астериск, что бы хоть как то заработала сказочная облачная телефония от Битрикса. Вот это все сетевики. И без них в таких ситуациях никак.
Бытует мнение, что на Windows нет альтернативы telnet, однако это неверно. Существует штатная утилита Test-NetConnection, которую можно запустить из PowerShell.
Да, но она не очень удобная если мне надо проеврять много серверов\компьютеров. Если устройства нет в сети, то процесс затянется очень надолго.
А еще штатный telnet, тоже когда не может подключиться, то консоль застревает и CTRL + C или CTRL + ] не обрывает команду.
Поэтому учитвая все это, я написал небольшую утилиту для себя на PowerShell, а за тем конвретировал PS1 скрипт в EXE с помощью утилиты PS2EXE, и поместил исполняемый файл в папку C:\Users\%USER_PROFILE%\AppData\Local\Microsoft\WindowsApps под названием tel.EXE, чтобы можно было вызывать ее из CMD сразу. Плюс к тому же писать telnet дольше чем tel ;).
Утилита обладает следующими качествами:
- Если в течение 500 милисекунд не может подключиться, то проверка обрывается
- Есть возможность оборвать процесс Ctrl + C
- Есть возможность поставить -t в конце команды, для бесконечной проверки заданного порта. Пример: tel server01 443 -t. Анологичен аргументу -t в ping.
- Есть функция игнорирования https:// и http:// в начале адреса сервера. Иногда бывает что копируешь ссылку с бразуера для проверки адреса, и в командную строку добавляется с https:// или http://, приходится еще это стирать. С этой функцией не надо запариваться стирать префиксы https:// или http://, она сама их уберет. Пример: tel httрs://server01 8443
Ниже в под спойлером исходный код:
function TestServerPort {
param(
[Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$ComputerName, #Server DNS name or IP address
[Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] $Port, #Server Port
[Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] $Timeout #Timeout
)
try {
$tcpclient = New-Object -TypeName system.Net.Sockets.TcpClient
$iar = $tcpclient.BeginConnect($ComputerName, $port, $null, $null)
$wait = $iar.AsyncWaitHandle.WaitOne($timeout, $false)
if (!$wait) {
$tcpclient.Close()
return $false
}
else {
$null = $tcpclient.EndConnect($iar)
$tcpclient.Close()
return $true
}
}
catch {
$false
}
}
if ($args.Count -eq 1) {
$value = $args[0]
if (($value -eq "/?") -or ($value -eq "?") -or ($value -eq "-?") -or ($value -eq "-h") -or ($value -eq "h") -or ($value -eq "/h")) {
Write-Host ""
Write-Host " ********************************"
Write-Host " ** **"
Write-Host " **Created by Akshin Mustafayev**"
Write-Host " ** **"
Write-Host " ********************************"
Write-Host ""
Write-Host " This tool tests connection between your computer and the remote server using specified port."
Write-Host " List of arguments available for this tool: "
Write-Host " -? , /? , ? : Shows help information"
Write-Host " -h , /h , h : Shows help information"
Write-Host ""
Write-Host " -t , /t , t : Loops port check. Similar to `"ping your_server -t`" command"
Write-Host ""
Write-Host ""
Write-Host " Usage examples:"
Write-Host " tel -?"
Write-Host " tel srv 443"
Write-Host " tel srv 443 -t"
Write-Host ""
Write-Host ""
Write-Host " Press `"Control + C`" to terminate execution of the program."
Write-Host ""
}
break
}
if ($args.Count -ge 2) {
$server = $args[0]
$port = $args[1]
$server = $server.ToString().Replace("https://", "")
$server = $server.ToString().Replace("http://", "")
$loop = $null
if (($null -ne $args[2]) -and ($args[2] -ne "")) {
$loop = $args[2]
}
Write-Host ""
if (($null -ne $loop) -and (($loop -eq "-t") -or ($loop -eq "/t") -or ($loop -eq "t"))) {
while ($true) {
$result = TestServerPort -ComputerName $server -Port $port -Timeout 500
if ($result) {
Write-Host " Connection success $($server):$($port)"
}
else {
Write-Host " Connection error $($server):$($port)"
}
Start-Sleep -Seconds 1
}
}
else {
$result = TestServerPort -ComputerName $server -Port $port -Timeout 500
if ($result) {
Write-Host " Connection success $($server):$($port)"
}
else {
Write-Host " Connection error $($server):$($port)"
}
}
}
else {
Write-Host ""
Write-Host " Error. Provide required arguments. Example: tel server1 443"
Write-Host " Write -? or -h to get help. Example: tel -h"
}
Не тянет это все на сетевика. Обыкновенные навыки обыкновенного админа в обыкновенном малом / среднем бизнесе. Сетевик это обычно все же Энтерпрайз/ провайдер / оператор связи.
С точки зрения админа и безопасника устанавливать netcat без особой необходимости на хостах наверное не надо, чтобы не облегчать задачу тому кто захочет каким нибудь 'reverse shell' баловаться.
Eще есть такой аспект что рвать коннект для теста не всегда хорошо для приложения (могут появляться нежелательные ошибки в логах) и утилиты типа tcping более мягко обходятся с сервером. Хотя tcping вроде тоже не может отличить дропнутый фаерволом пакет от не слушающего сервера.
А есть что то менее мощное чем nc чтобы такое диагностировало?
чтобы не облегчать задачу тому кто захочет каким нибудь 'reverse shell' баловаться.
Тот, кто получит доступ к хосту для целей reverse shell, разве не сможет залить на сервер свой собственный netcat?
Eще есть такой аспект что рвать коннект для теста не всегда хорошо для приложения (могут появляться нежелательные ошибки в логах)
Ну, хорошо, мы так делать не будем. Это остановит злоумышленника?
не может отличить дропнутый фаерволом пакет от не слушающего сервера.
А как технически это отличать?
Тот, кто получит доступ к хосту для целей reverse shell, разве не сможет залить на сервер свой собственный netcat?
Может но не так просто чем если nc уже там. Можно и однострочник на питоне сделать
Как и вся другая ИБ эта мера чтобы уменьшить вероятность и усложнить эксплуатацию уязвимости а не исключить ее полностью
Ну, хорошо, мы так делать не будем. Это остановит злоумышленника?
Ну как раз появление странных логов от неаккуратных сканеров может быть хорошим звоночком
А как технически это отличать?
См в статье. Мое скромное понимание в том что фаервол можно сконфигурять 2 варианта ответа
1) REJECT — в этом случае мы говогрим всему миру что тут есть Фаервол и он посылает тебя подальше с явным сообщением что сюда не ходи. Соответсвует как правило 'Connection closed'
2) DROP — тогда ответ не отличим от отсутствующего сервиса. Ответ не посылается и клиента просто игнорят — нас тут нет. Как правило это скорее показывается как 'Timeout'
Внутри сети обычно хорошие админы и сетевики ставят REJECT чтобы облегчить дебаг и вовне DROP чтобы не облегчать (см выше)
Дислкожа — я не сетевик так что поправляйте если что
1) REJECT — в этом случае мы говогрим всему миру что тут есть Фаервол и он посылает тебя подальше с явным сообщением что сюда не ходи. Соответсвует как правило 'Connection closed'
2) DROP — тогда ответ не отличим от отсутствующего сервиса. Ответ не посылается и клиента просто игнорят — нас тут нет. Как правило это скорее показывается как 'Timeout'
Ох...
cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_8.3
^C
или так:< /dev/udp/8.8.8.8/53 || echo "Not OK" && echo "OK"
OK
Очень редко FW настраивают на отправку RST в запрос на соединение.
А диагностика сети с использованием strace и анализом трассировки стека — это конечно круто, но больно и сложно.
getnameinfo(getaddrinfo(HOSTNAME)) = HOSTMANE
Условие так себе, как мне кажется. ;)
Бытует мнение, что на Windows нет альтернативы telnet, однако это неверно.
На Windows и nmap работает, хотя он, конечно, не штатный.
Сетевики нужны и вот почему