Для OpenVPN входа баш скрипт для DD-WRT роутер


Этот скрипт начинает работать по DD-WRT как я работает OpenVPN сервер на нем просто безопасно подключаться к моей домашней сети, когда я на ходу. Обычно вход ($1), Что входит в этот сценарий .tmp файл создается командой OpenVPN, когда какой-нибудь пользователь хочет зайти на сервер. Интернет .файл tmp состоит из 2 линий, где 1-я строка-это имя пользователя и 2-й линии-это пароль.

В этот день и возраст, я боюсь, что потенциальные хакеры могут внедрить вредоносный непредвиденные аргументы в имя пользователя или пароль, который может использовать мой скрипт с целью взять контроль над маршрутизатор DD-WRT и (по аналогии с SQL-инъекции). До сих пор я сделал некоторые огромные улучшения в скрипт, но я не уверен, если я закончил.

#!/bin/sh

#This script was made with OpenVPN via-file in mind

#Location of the Approved Username/Password File
USERS="/somefolder/users"

#Check to see if username and password in the OpenVPN file has any special characters line by line
#Terminate script if special characters are used
while IFS= read -r line
do
    case "$line" in *[!-_a-zA-Z0-9]*) exit 1 ;; esac
done < "$1"

Username=`awk 'NR==1' "$1"`
Password=`awk 'NR==2' "$1"`

        HASHPASS=`echo -n "$Username$Password" | md5sum | sed s'/\  -//'`
        i=0
        while [ $i -lt 10 ]; do
                HASHPASS=`echo -n $HASHPASS$HASHPASS | md5sum | sed s'/\  -//'`
                i=`expr $i + 1`
        done

    if grep -q "$Username:$HASHPASS" $USERS; then
        echo "User Authenticated."
        exit 0
    fi

echo "Login credentials failed."
exit 1


Комментарии
1 ответ

Быть параноиком о $PATH

Это хорошая идея, чтобы запустить этот скрипт с

PATH=/usr/bin:/bin

Также рекомендуется использовать полные пути к программам.

Получить оболочку, чтобы проверить некоторые ошибки

set -e -u

Использование нижнего регистра для переменных

Верхний регистр используется для общения известные переменные среды между программами. Предпочитаю строчные для наших собственных внутренних переменных оболочки, чтобы избежать любых конфликтов.

Упростить допустимых символов проверка

В while-do цикл может быть простым grep:

if /bin/grep -q '[^-_a-zA-Z0-9]' "$1"
then exit 1
fi

С set -eэто просто

! /bin/grep -q '[^-_a-zA-Z0-9]' "$1"

Если честно, я не уверен, что такая проверка необходима, если мы не передаем имя пользователя в качестве регулярного выражения - см. "соответствовать" ниже.

Варианты echo не портативный

Рассмотрим printf '%s' вместо (или, в bash, <<< перенаправление)

Рассмотрим for вместо while для пересчитать петли

С Баша, мы могли бы использовать арифметические for петли. Для стандартной оболочки, рассмотреть

for i in $(seq 10)
do
hashpass=$(printf '%s%s' "$hashpass" "$hashpass" | \
/usr/bin/md5sum | /usr/bin/cut -d' ' -f1)
done

Вы могли бы вместо этого написать фильтр, функция и просто положить, что код в 10 раз (что может работать немного быстрее, так как части могут работать параллельно, и встроенный read это лучше, чем начинать процесс, чтобы удалить имя часть выпуска):

function hashround() {
local hash rest
read hash rest
printf '%s%s' "$hash" "$hash" | /usr/bin/md5sum
}

hashpass=$(printf '%s%s' "$Username" "$Password" | /usr/bin/md5sum \
| hashround | hashround | hashround | hashround | hashround \
| hashround | hashround | hashround | hashround | hashround \
| /usr/bin/cut -d' ' -f1)

(Мы могли бы даже исключить, что окончательное cut если мы соглашаемся использовать его в качестве ${hashpass%% *} чтобы удалить второе поле в качестве оболочки замену.)

Матч точно

Вместо прохождения регулярного выражения к конечному grepиспользуйте grep -F, а также соответствовать всей строке (-x):

if /bin/grep -Fxq "$Username:$hashpass" "$users"
then
echo "User Authenticated." >&2
exit 0
fi

Я перенаправил вывод в стандартный поток ошибок, поэтому он не мешает с фактическим выходом.

1
ответ дан 26 марта 2018 в 09:03 Источник Поделиться