OpenSSH and users anonymity

24.02.2007 12:51 | blackhole

Niekedy ked sa rozhodneme spravit nejaku tu masinku, ktora moze casom na svojich diskoch obsahovat rozne zaujimave udaje chceme okrem ineho zabezpecit aj nejaku tu anonymitu pre userov.

Hovorim hlavne o komunitnych masinach kde naozaj nechceme nejakym sposobom uchovavat ktory clovieck sa prihlasil z akej IP adresy.

Kedze jednu takuto masinku som pred nedavnom robil a riesil som podobny problem hladal som sposob ako zabezpecit prepisovanie IP adresy v binarnych a textovych logoch. Od rocnych programov ktore periodicky tieto adresy hladaju a prepisuju cez preloadnute kniznice, ktore data realtime pozmenuju...

Najjednoduchsi a asi aj najefektivnejsi sposob sa mi vidi uprava priamo zdrojovych kodov SSH daemona.
Takze k veci.

Vezmeme si zdrojaky OpenSSH a zamierime priamo k suboru canohost.c

Prejdeme na lajnu cca 138 kde vidime nieco taketo:

if (!ai) {
/* Address not found for the host name. */
logit("Address %.100s maps to %.600s, but this does not "
"map back to the address - POSSIBLE BREAK-IN ATTEMPT!",
ntop, name);
return xstrdup(ntop);
}
return xstrdup("cyberspace");

Jedine co som upravoval ako si hned vsimnete je posledny riadok funkcie aby namiesto hodnoty v premennej name vratilo nami zvoleny maskovaci text.

Podobne postupujeme v dalsich castiach suboru...

Line 235:

if (use_dns)
canonical_host_name = host;
else
remote_ip = host;
host = "cyberspace";
return host;

Line 329:

const char *
get_remote_ipaddr(void)
{
static char *canonical_host_ip = NULL;

/* Check whether we have cached the ipaddr. */
if (canonical_host_ip == NULL) {
if (packet_connection_is_on_socket()) {
canonical_host_ip =
get_peer_ipaddr(packet_get_connection_in());
if (canonical_host_ip == NULL)
cleanup_exit(255);
} else {
/* If not on socket, return UNKNOWN. */
canonical_host_ip = xstrdup("UNKNOWN");
}
}
canonical_host_ip = "cyberspace";
return canonical_host_ip;
}

Line 341:

const char *
get_remote_name_or_ip(u_int utmp_len, int use_dns)
{
static const char *remote = "";
if (utmp_len > 0)
remote = get_canonical_hostname(use_dns);
if (utmp_len == 0 || strlen(remote) > utmp_len)
remote = get_remote_ipaddr();
remote = "cyberspace";
return remote;
}

Takze to by malo byt vsetko po skompilovani a naslednom spusteni by sme uz mali vidiet nasledujuce:

# who
wire tty1 Feb 24 12:08
wire pts/7 Feb 24 13:36 (cyberspace)
# finger wire
Login: wire Name: (null)
Directory: /home/wire Shell: /bin/tcsh
On since Sat Feb 24 12:08 (CET) on tty1 1 hour 38 minutes idle
On since Sat Feb 24 13:36 (CET) on pts/7 from cyberspace
# last wire
wire pts/7 cyberspace Sat Feb 24 13:36 still logged in
# grep Accepted /var/log/messages
Feb 24 13:36:34 www sshd[24085]: Accepted password for wire from cyberspace port 2767 ssh2

Takze tak.. uvedomujem si ze z hladiska programatorskeho sa to dalo vyriesit urcite krajsie, urcite touto upravou je mozne mnoho riadkov uplne vymazat ale ja som to radsej nerobil, nestudoval som tie kody az tak do podrobna takze tato uprava mi pripadala "opaatrna" :))

    • OPRAVA 26.02.2007 | 20:34
      Avatar blackhole   Návštevník

      Rad by som este upozornil ze zmeny ktore som uviedol niesu vsetky, zistil som, ze este v par funkciach trebalo urobit zmeny.
      Pre zjednodusenie som spravil na dane OpenSSH 4.4 patch ktory okrem anonymity zahrna aj zakrytie Version Bannera. Tato info o verzii sa neda nijak normalnym sposobom vypnut takze treba upravit zdrojaky.

      Bezne ssh :
      # telnet xxx.xxx.xxx.xxx 22
      Connected to xxx.xxx.xxx.xxx.
      Escape character is '^]'.
      SSH-2.0-OpenSSH_4.5p1 FreeBSD-20061110

      S pouzitym patchom vysledny Version Banner vyzera takto:
      SSH-2.0-OpenSSH_hiden

      Spominany patch mozete stiahnut tu openssh-4.4-hidehost-2.0.patch

      V danom patchi je string Ancien.Egypt , ten si prepiste na aky chcete, je to string, ktory bude vsade zobrazovany a logovany namiesto IP adresy / hostname.