I think the basic problem is that you do not check if L2 is already found in the first clause of t_brother/3. And the initial L1 should be added to the list in brother/2:
brother(L1, L2) :-
t_brother(L1, L2, [L1]). % <-- [L1] instead of []
t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L2),
\+ member(L2, IntermediateNodes). % <-- added this check
t_brother(L1, L2, IntermediateNodes) :- % <-- this clause is unchanged
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
t_brother(L3, L2, [L3 | IntermediateNodes]).
You can still shorten the solution by using a disjunction:
t_brother(L1, L2, IntermediateNodes) :-
s_brother(L1, L3),
\+ member(L3, IntermediateNodes),
( L2=L3
; t_brother(L3, L2, [L3 | IntermediateNodes])).