
Давно задумывался об админском бэкдоре к сильно удаленным, а подчас и изолированных от интернета, сетям. Проблемы последних дней лишь подстегнули моё желание разложить эту тему до полной ясности.
Ключевые слова здесь - модем и dial-up.
Классический телефонный модем сознание отталкивает из-за цены решения и пользования: надо иметь выделенный номер, оплачивать абонентскую плату, время соединения. К тому-же, скорость и надежность не высокие.
3G-модемы обеспечивают существенно более высокие скорость и надежность, о также гибкий выбор тарифов и не зависит от наличия телефонной инфраструктуры. Для 3G-модемов мне не ясно, как обеспечивается работа для входящих соединений, но, думаю, что это и не интересно, если обеспечить управление посредством смс.
Управление посредством смс
Пример возможных команд:
-
подключить модем к интернету;
-
установить VPN-соединение (openVPN client) с главным офисом;
-
разорвать соединения (интернет и VPN);
-
диагностические команды (ping, traceroute и пр.)
Безопасность при управлении посредством смс
Можно (нужно) проверять номер отправителя, но, говорят, что номер отправителя можно подменить. Поэтому лучше применить ASCII-скремблирование с проверкой даты и, возможно, текущего времени. Еще лучше - применить PGP.
Хорошо бы также предусмотреть ответные смс с подтверждением полученной и/или выполненной смс-команды.
Взаимодействие с 3G-модемами
Важные AT-команды:
-
AT+CSCA="+37129202020" (адрес смс сервис-центра)
-
AT+CMGF=1 (формат смс: текстовый)
-
AT+CPMS="SM" (указание на область памяти для хранения смс)
Отправить смс:
-
AT+CMGS="55555555">
текст смс
CTRL+Z
Прочитать смс:
-
AT+CMGL="REC UNREAD" (по статусу)
-
AT+CMGR=0 (по индексу)
Как получать уведомление о получении новой смс без постоянного опрашивания модема:
-
AT+CNMI=1,1 (тогда при получении новой смс в консоль выдается сообщение +CMTI: "SM",0)
затем
Do
If port.BytesToRead > 0 Then
stat = checkport(300)
If InStr(1, stat, "+CMTI:") Then
...
End If
End If
Loop
Function checkport(t As Integer)
System.Threading.Thread.Sleep(t)
rxBuff = port.ReadExisting
checkport = rxBuff
'Console.WriteLine("Return: " & checkport)
End Function
Пример простейшего ASCII-скремблирования
'Создаю "ключ"
For i = 0 To 95
arrayKey(i) = 95 - i
Next
'Вычисляю длину сообщения
textLen = Len(tbInput.Text)
ScrambledText = ""
For i = 1 To textLen
Num = Asc(Mid(tbInput.Text, i, 1)) - 31 + i
If Num > 95 Then Num = Num - 95
ScrambledText = ScrambledText & Chr(arrayKey(Num) + 31)
Next
Тогда для дескремблера написал такой код:
'Создаю "ключ"
For i = 0 To 95
arrayKey(95 - i) = i
Next
'Вычисляю длину сообщения
textLen = Len(tbText.Text)
DescrambledText = ""
For i = 1 To textLen
Num = Asc(Mid(tbText.Text, i, 1)) - 31 + i
If Num > 95 Then Num = Num - 95
DescrambledText = DescrambledText & Chr(arrayKey(Num) + 31)
Next
Вместо заключения
Задача реально решаема, осталось найти время и желание, чтобы ее проверить на практике.
Практические заметки
Huawei E1750 после подключения создает 3 порта:
-
Vodafone Mobile Broadband Modem (Huawei)
-
Vodafone Mobile Broadband Secondary Port Modem (Huawei)
-
Vodafone Mobile Broadband Diagnostics Port (Huawei)
Для данной темы применим лишь Secondary Port Modem.