LINUX.ORG.RU
ФорумAdmin

Сравнение пароля


0

1

Приветствую. Возникла мега-срочная проблема у начинающего линуксоида... Проблема заключается в решении задачи: сравнить набор символов с паролем текущего пользователя под win & *nix. Если под win проблема решилась довольно быстро, то с линуксом получается все жутко сложно...

Долгое гугление не дало никаких результатов. Но, как я понял, это можно делать через вызов sudo, или пробовать подключиться к самому себе по ssh. оба способы чертовски страшны, как минимум тем, что не факт, что есть ssh или sudo, возможно пароль запрашивать не будут, и так далее. а есть ли какой то более простой способ решения задачи? скрипт, или что то другое? В проекте используется java и либа jna...


Ответ на: комментарий от Chaser_Andrey

ну типа того.... для выполнения каких то кусов кода требуется авторизация через LDAP, если машина в домене, или по локальному имени пользователя и пароля. локальные имя пользователя и пароли, в случае если машина не в домене. таким образом у меня остается только 1 вариант проверки пароля на валидность в случае без домена. Вариант с хэшами не подходит, так как это не соответствует задаче, а скорее, является взломом системы. Да и права нужны будут, скорее всего, и конечному пользователю не понравится повышение уровня прав.

monyag
() автор топика
Ответ на: комментарий от monyag

Просто так пароль в чистом виде не вытянуть из системы. Ну попробуй сделать дамп памяти и найти в нём массив символов, который является твоим паролем. Учти, что кодировки бывают разные. Но вряд ли оно храниться постоянно в памяти.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

вытягивать мне его тоже нет интереса. нужно какой то операцией проверить реакцию на пароль. примет ли его система, или отвергнет. Аналогия с брутфорсом, в принципе верна. примет - код выполняем, нет - не выполняем -)

monyag
() автор топика

В линукс пароль нигде не хранится. Хранится его хеш в /etc/shadow, но он не доступен на чтение никому кроме рута. Так что, единственный вариант без хаков проверить правильность пароля - попытаться авторизоваться с этим паролем в системе. Например, сделать su, которая-таки входит в coreutils и есть почти везде. Возможно, есть некие системные вызовы, которые позволяют то же самое сделать без сторонних программ. Гляньте исходники той же su.

roof ★★
()
Ответ на: комментарий от roof

проблема в том, что в данный момент я нахожусь под рутом. Вызов su пароль не спрашивает...

Да, я понял что авторизация - это единственный способ. Какие еще есть способы авторизации с паролем кроме su и ssh? Решение не нагуглил, пока буду адаптировать приложение к вызову sudo su. буду надеяться, что есть более простой способ авторизации в *nix системах

monyag
() автор топика
Ответ на: комментарий от Chaser_Andrey

убедили в бесполезности дальнейшего гугления. Спасибо! будем работать над проблемой

monyag
() автор топика
Ответ на: комментарий от monyag

Найдитесь под кем-нибудь другим, не будет же Ваш софт под рутом работать? :) Говорю же, если пишете не на скриптовом языке, то смотрите в сторону системных вызовов, и/или интерфейсов к pam.

roof ★★
()

Брутфорсь на здоровье :)

rull@drull-netbook:~/1$ cat 1.cpp 
#include <shadow.h>
#include <stdio.h>
#include <crypt.h>
#include <string.h>

int main(int argc, char **argv)
{
struct spwd password;
password = *getspnam(argv[1]);
if(strcmp(password.sp_pwdp,crypt(argv[2],password.sp_pwdp))==0)
        {
        printf("OK\n");
        }
        else
        {
        printf("FAIL\n");
        }
return 0;
}
drull@drull-netbook:~/1$ g++ -lcrypt 1.cpp -o checkpass
drull@drull-netbook:~/1$ sudo useradd test
drull@drull-netbook:~/1$ sudo passwd test
Введите новый пароль UNIX:  <--------------------(пароль - 12345)
Повторите ввод нового пароля UNIX: 
passwd: пароль успешно обновлён
drull@drull-netbook:~/1$ sudo ./checkpass test 12345
OK
drull@drull-netbook:~/1$ sudo ./checkpass test 54321
FAIL
drull ★☆☆☆
()
Ответ на: комментарий от monyag

Если используешь ldap, то мой пример может не подойти. Лучше взять это. Там используется ПАМ. Потребуется пакет libpam0g-dev.

drull ★☆☆☆
()

passwd требует ввода текущего пароля для изменения (если ты не root). passwd есть всегда. Набросай скрипт на expect.

gorilych ★★
()
Ответ на: комментарий от aol

Спасибо, сделал через библиотечку JPam. если кому интересно -

@Override

public boolean isUserValid(String userName, String password) {

try {

LoginContext lc = new LoginContext(«module», new MyCallbackHandler(userName, password));

lc.login();

} catch (Exception e) {

return false;

}

return true;

}

private class MyCallbackHandler implements CallbackHandler {

private String userName;

private String password;

private MyCallbackHandler(String un, String pwd) {

this.userName = un;

this.password = pwd;

}

public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

for (int i = 0; i < callbacks.length; i++) {

if (callbacks[i] instanceof NameCallback) {

NameCallback nc = (NameCallback) callbacks[i];

nc.setName(userName);

} else if (callbacks[i] instanceof PasswordCallback) {

PasswordCallback pc = (PasswordCallback) callbacks[i];

pc.setPassword(password.toCharArray());

} else {

throw new UnsupportedCallbackException

(callbacks[i], «Unrecognized Callback»);

}

}

}

}

monyag
() автор топика
Ответ на: комментарий от monyag

а JAAS, кстати, много разных методов умеет. и ldap в том числе

aol ★★★★★
()

FreeBSD проблема

В предыдущем комменте дана ссылка на сишную реализацию. Но она не работает в FreeBSD, всегда возвращает false. причину я не понял, но, программа даже не пытается сравнить пароль... Как вы считаете, где зарыта проблема?

monyag
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.