Чаму сканаванне портаў зменіцца пры запуску з sudo
Калі сырыя сокеты недаступныя, Nmap ціха замяняе сканаванне SYN на сканаванне TCP connect, таму запуск ад root і ад звычайнага карыстальніка вымярае розныя шляхі.
Nmap не заўсёды адпраўляе той пакет, які вы, на вашу думку, запыталі. Калі сырыя сокеты недаступныя, ён замяняе стандартнае сканаванне SYN на сканаванне TCP connect, таму запуск ад вашага звычайнага карыстальніка і запуск пад sudo могуць адказваць на розныя пытанні пра адзін і той жа порт. Вынікі выглядаюць як праблема правоў, але звычайна гэта змена метаду. Зрабіць метад яўным — адзіны спосаб наогул параўнаць два запускі.
Два запыты, адзін порт, розныя шляхі ў кодзе
Сканаванне SYN само будуе загаловак TCP, адпраўляе яго з сырага сокета і чытае адказ з сеткі раней, чым TCP-стэк ядра зафіксуе завершанае злучэнне. Сканаванне connect просіць аперацыйную сістэму адкрыць звычайны сокет і паведамляе пра тое, што вяртае connect(). Абодва могуць назваць порт адкрытым, але толькі адно пакідае напаўадкрытую спробу і толькі адно падпарадкоўваецца палітыцы ўзроўню сокета, прывязанай да працэсу, які адпраўляе.
Сыры шлях патрабуе CAP_NET_RAW, таму стандартнае сканаванне ціха пагаршаецца, калі гэтай магчымасці няма. Уласны даведнік па тэхніках сканавання Nmap дакументуе гэту замену: сканаванне connect — гэта запасны варыянт, бо яно зусім не патрабуе спецыяльных правоў. Замена адбываецца без папярэджання ў большасці запускаў, і менавіта таму яе так лёгка прачытаць няправільна. Калі вы ведаеце, што запасны варыянт існуе, «адкрыта ад root, зачынена ад карыстальніка» перастае гучаць як памылка правоў і пачынае гучаць як два розныя вымярэнні.
Што sudo насамрэч змяняе ў сканаванні
Павышэнне правоў вяртае шлях сырага сокета, і гэта змяняе больш, чым вердыкт. Выбар зыходнага порта, таймінг пакетаў, паводзіны пры перадачы і спосаб класіфікацыі адфільтраванага адказу — усё гэта паходзіць з рознага коду. Прамежкавы вузел, які абмяжоўвае частату SYN, ставіцца да двух запускаў неаднолькава, нават калі мэтавы хост ідэнтычны.
Журнаванне на баку мэты таксама адрозніваецца. Завершанае рукапоцісканне бачнае сэрвісу і любому ўліку сокетаў, а скінуты напаўадкрыты запыт часта не бачны. Калі вы параўноўваеце запускі з хостам, журналы якога таксама чытаеце, частка назіранай розніцы — гэта само назіранне.
Трымайце метад нязменным у абодвух запусках
Забяспечце адну і тую ж тэхніку ў абодвух выкліках, і параўнанне пачне нешта значыць. Сцяг -sT патрабуе сканавання connect яўна, -Pn прыбірае выяўленне хоста, -n прыбірае развязанне імёнаў, а адзін -p прыбірае розніцу спісаў портаў.
nmap -sT -Pn -n -p 8443 198.51.100.77
sudo nmap -sT -Pn -n -p 8443 198.51.100.77
Замяніце адрас і порт на хост, які вам дазволена тэсціраваць; дыяпазон дакументацыі вышэй — гэта прыклад, а не мэта. Калі два запускі цяпер супадаюць, першапачатковая розніца паходзіла ад метаду сканавання. Калі яны ўсё яшчэ не супадаюць, нешта іншае класіфікуе трафік, і наступны раздзел — месца, дзе шукаць.
Кантэкст уліковага запісу — гэта не толькі сцяг правоў
Разгортванне VPN можа класіфікаваць пакеты па UID, па cgroup або па правіле, прывязаным да працэсу, які адкрыў сокет. Тады трафік root і трафік карыстальніка выходзяць праз розныя табліцы маршрутызацыі або трапляюць у розныя наборы правілаў, і ніякая дысцыпліна метаду сканавання іх не ўзгадніць.
Даследуйце палітыку, а не права. У Linux nftables выражае гэта праз meta skuid, а iptables — праз супадзенне ўладальніка, і любое з іх можа адправіць адзін UID у тунель, пакуль іншае працягвае выкарыстоўваць фізічны маршрут па змаўчанні.
sudo nft list ruleset | grep -n skuid
sudo iptables-save | grep -n uid-owner
ip rule show
ip route get 198.51.100.77
Пацвердзіце запыт, перш чым параўноўваць вынікі
Перш чым рабіць высновы, дакажыце, які запыт выканаўся. Nmap называе тэхніку ў сваім вывадзе, а --reason дадае доказ за кожным станам, і менавіта гэта паказвае, ці сапраўды завяршылася рукапоцісканне.
nmap --reason -sT -Pn -n -p 8443 198.51.100.77
sudo nmap --reason -sS -Pn -n -p 8443 198.51.100.77
getcap "$(command -v nmap)"
capsh --print | grep -i net_raw
Два запускі, якія паведамляюць адзін стан па розных прычынах, не супярэчаць адзін аднаму, а два запускі, якія паведамляюць розныя станы па адной прычыне, паказваюць на маршрутызацыю або палітыку, а не на сканаванне. Трымайце мэту, порт, прастору імёнаў і таймінг аднолькавымі, затым змяняйце па адной зменнай за раз. Запуск сэрвісу ад root не з’яўляецца выпраўленнем неадпаведнасці палітыкі; выпраўленне — выразіць жаданую палітыку праз уладальніка сэрвісу.