Время прочтения: 2 мин.
В ходе аудита исходного кода макросов в файлах расширения «.xlsm» на предмет наличия логинов/паролей в открытом виде была выявлена проблема необходимости ручного анализа большого объёма информации, и как следствие, значительного количества времени и ресурсов, необходимых на проведение данной проверки. Целью проверки было найти логины/пароли для подключения к критичным ресурсам, в особенности к базам данных, что приводит к возникновению риска компрометации пароля, несанкционированного подключения к ресурсам, а также последующей утечки конфиденциальной информации.
В качестве решения было принято использовать автоматизированные методы анализа – скрипт на языке python.
В первую очередь необходимо извлечь исходный код макроса из документа Microsoft Office c расширением «.xlsm».
Для решения этой задачи был использован метод VBA_Parser библиотеки oletools языка python:
from oletools.olevba3 import VBA_Parser
Далее необходимо было проверить наличие в коде конструкции для подключения к базам данных, а также ключевого слова «password», в котором может содержаться переменная с паролем:
if (("connection" in str(b).lower()) and (("sqloledb" in str(b).lower()) or ("msdaora" in str(b).lower()) )):
if (("sspi" not in str(b).lower()) and ("trusted" not in str(b).lower()) and ("integrated" not in str(b).lower())):
При помощи условия, приведённого выше, может быть проверено наличие в коде подключения к базе, не использующего доменную авторизацию, что скорее всего говорит о наличии пароля в самом коде макроса.
Также проверялось наличие в коде ключевого слова «password», которое может свидетельствовать о наличии в коде переменной с паролем:
if ("password" in str(b).lower()):
Полный код скрипта представлен ниже:
from oletools.olevba3 import VBA_Parser
path = 'C:\\Users\\User12\\Documents\\macro__1.xlsm'
vbaparser = VBA_Parser(path)
for (x,c,v,b) in vbaparser.extract_macros():
if ".frm" not in str(v).lower():
if (("connection" in str(b).lower()) and (("sqloledb" in str(b).lower()) or ("msdaora" in str(b).lower()) )):
if (("sspi" not in str(b).lower()) and ("trusted" not in str(b).lower()) and ("integrated" not in str(b).lower())):
print ("database connect detected!")
if ("password" in str(b).lower()):
print ("password detected ", c)
В результате отработки скрипта были выбраны макросы, потенциально содержащие логины/пароли, для ручной проверки, что в целом многократно сэкономило время, необходимое на проведение аудита. Таким образом, применение скрипта позволит проводить периодические проверки макросов и повысить уровень кибербезопасности организации в целом.