[Solaris] UNIX password zetten vanuit lijst

Pagina: 1
Acties:

  • Spearhead
  • Registratie: November 2001
  • Laatst online: 14-08-2025
Ik moet voor iets van 200 mensen wachtwoorden aanpassen vanuit een lijst, met daarin onder andere username en het originele (niet-gecrypte) wachtwoord. Zo unsafe als wat natuurlijk, maar daar gaat het nu niet om.

Systeem is Solaris 9. Het punt is nu, dat passwd - in tegenstelling tot de linux versie - alleen maar input vanaf een tty accepteert.

Weet iemand hier misschien een handige oplossing voor ? Ik kan me voorstellen dat het ook wel mogelijk moet zijn om via een script de passwords te crypten en rechtstreeks in /etc/shadow te schrijven. Heeft iemand al eens zoiets gedaan ?
Mocht daar geen min of meer kant en klare oplossing voor bestaan probeer ik zelf wel wat te schrijven. Ik kom dan een heel eind, maar hoe crypt ik die passwords ?

Alvast bedankt voor het meedenken.

Verwijderd

# man crypt

of

wall Verander je wachtwoord. NU! >:)

[ Voor 83% gewijzigd door Verwijderd op 22-05-2003 08:26 ]


  • Spearhead
  • Registratie: November 2001
  • Laatst online: 14-08-2025
Dat lijkt me een beetje kort door de bocht. crypt wil een key hebben, en los daarvan geloof ik niet dat crypt hetzelfde algoritme gebruikt als passwd. Het lijkt me niet dat daar geldige gecrypte passwords uit gaan komen.

Verwijderd

De sleutel die crypt () wil hebben is dus juist het wachtwoord dat moet gaan worden versleuteld. De functie heeft een pointer naar de versleutelde versie van het wachtwoord als return-waarde.

[ Voor 10% gewijzigd door Verwijderd op 22-05-2003 08:58 ]


  • Spearhead
  • Registratie: November 2001
  • Laatst online: 14-08-2025
Volgens mij hebben wij spraakverwarring :) De crypt die ik ken is deze:

NAME
crypt - encode or decode a file

SYNOPSIS
crypt [password]

DESCRIPTION
The crypt utility encrypts and decrypts the contents of a
file. crypt reads from the standard input and writes on the
standard output. The password is a key that selects a par-
ticular transformation. If no password is given, crypt
demands a key from the terminal and turns off printing while
the key is being typed in. crypt encrypts and decrypts with
the same key:

Jij bedoelt een functie die vanuit een C-programma aangeroepen moet worden ? Dat is lastig, want ik kan wel een beetje shell scripten, maar niet echt proggen.

Verwijderd

Idd, spraakverwarring en idd c-functie. :) Ik had het namelijk over de crypt die in deel 3 van de man pages staat. (Library functions)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CRYPT(3)                       Library functions                      CRYPT(3)



NAME
       crypt - password and data encryption
 
SYNOPSIS
       #define _XOPEN_SOURCE
       #include <unistd.h>
 
       char *crypt(const char *key, const char *salt);
 
DESCRIPTION
       crypt  is  the  password  encryption function.  It is based on the Data
       Encryption Standard algorithm with  variations  intended  (among  other
       things)  to discourage use of hardware implementations of a key search.
 
       key is a user's typed password.
 
       ...blablabla...
 
RETURN VALUE
       A pointer to the encrypted password is returned.   On  error,  NULL  is
       returned.
Ik weet echter niet of/hoe je deze functie vanuit een commandoschil kunt aanroepen. Maar ik denk niet dat het een heel moeilijk en uitgebreid c-programmaatje hoeft te zijn. (Ik gok op ongeveer 20 programmaregels.) Misschien is PERL ook een optie voor je?

  • bolluserectus
  • Registratie: November 2001
  • Laatst online: 22-04 20:05
Volgens mij reageert jointm1k wel vaker om te reageren..
beetje irri

Actions speak louder than words


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

perl -e 'print crypt("password", "salt") . "\n"'

waar password == password (doh.)
en salt is twee letters. Deze letters worden gebruikt om het password te genereren en zijn altijd de eerste twee letters van het resultaat. (Dit om invoer met dezelfde salt te crypt()en en het te vergelijken).

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Het is me gelukt (oftewel hoe omzeil je het STDIN probleem) (niet op Solaris, maar op NetBSD 1.5, waar normaal gesproken passwd niet op STDIN reageert)

code:
1
$ ssh localhost "(echo '$newpasswd'; echo '$newpasswd' ) | sudo passwd $user"


Nu alleen nog maar zorgen dat ssh niet om een password vraagt

  • Spearhead
  • Registratie: November 2001
  • Laatst online: 14-08-2025
Okee, ik heb dus dit programmaatje gebruikt (gevonden op internet):

#include <stdio.h>
#include <string.h>

main(argc,argv)
int argc;
char *argv[];
{
char line[512],salt[3];
int i,l;

salt[2]='\0';

if(argc == 1) /* No parameters there read from standard input */
{
while(gets(line) != NULL)
{
l=strlen(line);
if(l > 2)
{
salt[0]=line[2];
salt[1]=line[1];
printf("%s\n",crypt(line,salt));
}
else
fprintf(stderr,"Too short [%i] \"%s\"\n",l,line);
}
}
else
{
for(i=1;i<argc;i++)
{
l=strlen(argv[i]);
if(l > 2)
{
salt[0]=argv[i][2];
salt[1]=argv[i][1];
printf("%s\n",crypt(argv[i],salt));
}
else
fprintf(stderr,"Too short [%i] \"%s\"\n",l,argv[i]);
}
}
}

Nu nog iets schrijven dat de output in /etc/shadow verwerkt, maar daar kom ik wel uit. Dank zover!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

bolluserectus schreef op 22 May 2003 @ 15:45:
Volgens mij reageert jointm1k wel vaker om te reageren..
beetje irri
Care to explain?

Verwijderd

Spearhead schreef op 22 mei 2003 @ 21:36:
Okee, ik heb dus dit programmaatje gebruikt (gevonden op internet):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <string.h>

main(argc,argv)
int argc;
char *argv[];
{
  char line[512],salt[3];
  int i,l;

  salt[2]='\0';

  if(argc == 1)   /* No parameters there read from standard input */
  {
    while(gets(line) != NULL)
    {
      l=strlen(line);
      if(l > 2)
      {
        salt[0]=line[2];
        salt[1]=line[1];
        printf("%s\n",crypt(line,salt));
      }
      else
        fprintf(stderr,"Too short [%i] \"%s\"\n",l,line);
    }
  }
  else
  {
    for(i=1;i<argc;i++)
    {
      l=strlen(argv[i]);
      if(l > 2)
      {
        salt[0]=argv[i][2];
        salt[1]=argv[i][1];
        printf("%s\n",crypt(argv[i],salt));
      }
      else
        fprintf(stderr,"Too short [%i] \"%s\"\n",l,argv[i]);
    }
  }
}

Nu nog iets schrijven dat de output in /etc/shadow verwerkt, maar daar kom ik wel uit. Dank zover!
Kun je dat dan niet beter in Perl omschrijven. Dan is je textfile handling een stukje eenvoudiger.
edit:
Aargh. Kleurtjes

[ Voor 7% gewijzigd door Verwijderd op 23-05-2003 19:01 ]


Verwijderd

Verwijderd schreef op 23 May 2003 @ 19:00:
[...]

Kun je dat dan niet beter in Perl omschrijven. Dan is je textfile handling een stukje eenvoudiger.
edit:
Aargh. Kleurtjes
why? C kan prima met files omgaan hoor :)

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op 23 May 2003 @ 20:04:
[...]
why? C kan prima met files omgaan hoor :)
Een woord: regexp.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Spearhead
  • Registratie: November 2001
  • Laatst online: 14-08-2025
Welnu, ik heb onderstaand scriptje gemaakt (ik spreek geen Perl of C). Dit verwacht als command line optie een textfile met daarin username/password combo's:

#!/usr/bin/bash

FILE=/etc/shadow

cp "$FILE" "$FILE.ORG"
while read USER PASS; do
if [ -n "$USER" ] && [ -n "$PASS" ] && \
[ $USER!="root" ] && [ `grep "$USER:" "$FILE"` ]; then
PASSCRYPT=`./mkpasswd "$PASS"`
grep -v "$USER:" "$FILE" > "$FILE.NEW"
echo "$USER:$PASSCRYPT:::::::" >> "$FILE.NEW"
cp "$FILE.NEW" "$FILE"
else
echo "Fout bij user $USER"
fi
done < $1
rm "$FILE.NEW"
pwconv
Pagina: 1